实验时间 | 2024年 4 月10日19时至22时 | 学时数 | 3 | ||
1.实验名称 分治与减治算法实验:题目1 数字旋转方阵程序设计 | |||||
2.实验目的 (1)掌握分治法的设计思想; (2)掌握数字旋转方阵的具体实现过程; (3)熟练掌握二维数组的使用方法; (4)在掌握的基础上编程实现数字旋转方阵的实现过程。 | |||||
3.实验内容 给出一个初始数据,在此数据的基础上由外层向里层填写数据,完成一个数字旋转方阵,输出结果,输出时要求有文字说明。请任选一种语言编写程序实现上述算法,并分析其算法复杂度。 | |||||
用二维数组data[N][N]表示N×N的方阵,观察方阵中数字的规律,可以从外层向里层填数,如图所示。在填数过程中,每一层的起始位置很重要。设变量size表示方阵的大小,则初始时size=N,填完一层则size=size-2;设变量begin表示每一层的起始位置,变量i和j分别表示行号和列号,则每一层初始时i=begin,j=begin。将每一层的填数过程分为A、B、C和D四个区域,则每个区域需要填写size-1个数字,填写区域A时列号不变行号加1,填写区域B时行号不变列号加1,填写区域C时列号不变行号减1,填写区域D时行号不变列号减1。显然,递归的结束条件是size等于0或size等于1。 | |||||
9.实验源代码和伪代码 伪代码: 设递归函数Full实现填数过程,算法用伪代码描述如下。(这里只展示Full函数伪代码)
设递归函数Full实现填数过程,算法用伪代码描述如下。(这里只展示Full函数伪代码) 由于递归函数Full在调用过程中需要对同一个数组data[N][N]墙数,为避免传递参数,将数组data[N][N]设为全局变量,算法用C++语言描述如下:
时间复杂度分析: 假设要填写n阶数字旋转方阵,算法Full需要先填写A、B、C和D四个区域,由4个并列的循环组成,每个循环均执行n—1次,然后执行递归调用,填写n-2阶方阵,因此,该算法满足如下递推关系式: 不失一般性,假设n为偶数,用扩展递归技术解此递推式,得 T(n)=T(n-2)+4(n-1)=T(n-4)+4(n-3)+4(n-1) =T(0)+…+4(n-5)+4(n-3)+4(n-1) =O(n2) | |||||
代码运行截图: 心得: 分治是一种将大问题划分为小问题的求解思路,递归是程序的写法,也就是方法(分治)的方法。 |
分治与减治算法实验:题目1 数字旋转方阵程序设计
于 2024-04-12 21:39:05 首次发布