算法分析与设计实验一递归与分治策略

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一递归与分治策略

实验目的

1.了解并掌握递归的概念,递归算法的基本思想;

2.掌握分治法的基本思想方法;

3.了解适用于用分治法求解的问题类型,并能用递归或非递归的方式设计相应的分治法算法;

4.掌握分治法复杂性分析方法,比较同一个问题的递归算法与循环迭代算法的效率。预习与实验要求

1.预习实验指导书及教材的有关内容,掌握分治法的基本思想;

2.严格按照实验内容进行实验,培养良好的算法设计和编程的习惯;

3.认真听讲,服从安排,独立思考并完成实验。

实验原理

简单说来,当一个函数用它自己来定义时就称为递归。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。因此,在考虑使用递归算法编写程序时,应满足两点:1)该问题能够被递归形式描述;2)存在递归结束的边界条件。递归的能力在于用有限的语句来定义对象的无限集合。用递归思想写出的程序往往十分简洁易懂。一般说来,一个递归算法可以转换称为一个与之等效的非递归算法,但转换后的非递归算法代码将成倍地增加。

分治是一种被广泛应用的有效方法,它的基本思想是把最初的问题分解成若干子问题,然后在逐个解决各个子问题的基础上得到原始问题的解。所谓分治就是“分而治之”的意思。由于分解出的每个子问题总是要比最初的问题容易些,因而分治策略往往能够降低原始问题的难度,或者提高解决原始问题的效率。

根据如何由分解出的子问题求出原始问题的解,分治策略又可分为两种情形:第一,原始问题的解只存在于分解出的某一个子问题中,则只需要在原始问题的一个划分中求解即可;第二,原始问题的解需要由各个子问题的解再经过综合处理得到。无论是哪一种情况,分治策略可以较快地缩小问题的求解范围,从而加快问题求解的速度。

分治策略运用于计算机算法是,往往会出现分解出来的子问题与原始问题类型相同的现象,而与原问题相比,各个子问题的规模变小了,这刚好符合递归的特征。因此分治策略往往是和递归联系在一起的。

以下几个问题选做一项:

1.用分治策略写出并实现二分检索算法。

(1)选择合适的数据结构来表示问题中的数列;

(2)根据分治法的基本原理,写出求解二分检索的伪码算法;

(3)编制C++或JA V A等高级语言程序实现伪码算法;

(4)上机运行程序,验证算法的正确性,并分析算法的时空复杂性。

2.用递归和非递归方式各写一布尔函数,由该函数获取一个以0或1为元素的数组,并要求确定每个连续为1的序列的大小是否为偶数。

(1)形式化地描述该问题,确定采用的数据结构;

(2)用递归的思想写出求解该问题的伪码算法;

(3)用非递归的思想写出求解该问题的伪码算法;

(4)用C++或JA V A等高级程序语言实现上述伪码算法;

(1)比较递归和非递归实现的结果,验证算法的正确性,并作时空复杂性分析。

3.用分治策略实现斯特拉森矩阵乘法。

(1)选择合适的数据结构来表示问题;

(2)根据分治法的基本原理,写出斯特拉森矩阵乘法的伪码算法;

(3)编制C++或JA V A等高级语言程序实现伪码算法;

(4)上机运行程序,验证算法的正确性,并分析算法的时空复杂性。

4.用分治策略实现棋盘覆盖问题。

(1)选择合适的数据结构来表示问题;

(2)根据分治法的基本原理,写出棋盘覆盖问题的伪码算法;

(3)编制C++或JA V A等高级语言程序实现伪码算法;

(4)上机运行程序,验证算法的正确性,并分析算法的时空复杂性。

5.实现一个“由底向上”的归并分类算法,要求取消栈空间的需要。

(1)选择合适的数据结构来表示问题;

(2)根据分治法的基本原理,写出归并分类问题的伪码算法;

(3)编制C++或JA V A等高级语言程序实现伪码算法;

(4)上机运行程序,验证算法的正确性,并分析算法的时空复杂性。

1.按照实验报告手册的要求认真填写相关栏目;

2.写出用分治法实现二分检索、斯特拉森矩阵乘法或棋盘覆盖的伪码算法,写出算法

所用到的主要数据结构;

3.得出结果,并写出算法的时间复杂性和空间复杂性。

4.详细填写完成实验的收获和得失,实验过程中遇到的问题、解决的办法、实验心得

以及对该实验的建议和意见。

相关文档
最新文档