算法设计与分析:递归与分治法-实验报告(总8页)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法设计与分析:递归与分治法-实验报告(总8页)
实验目的:掌握递归与分治法的基本思想和应用,学会设计和实现递归算法和分治算法,能够分析和评价算法的时间复杂度和空间复杂度。
实验内容:
1.递归算法的设计与实现
3.算法的时间复杂度和空间复杂度分析
实验步骤:
1)递归定义:一个函数或过程,在其定义或实现中,直接或间接地调用自身的方法,被成为递归。递归算法是一种控制结构,它包含了解决问题的基础情境,也包含了递归处理的情境。
2)递归特点:递归算法具有以下特点:
①依赖于递归问题的部分解被划分为若干较小的部分。
②问题的规模可以通过递推式递减,最终递归终止。
③当问题的规模足够小时,可以直接求解。
3)递归实现步骤:
①确定函数的定义
②确定递归终止条件
③确定递归调用的过程
4)经典实例:斐波那契数列
递推式:f(n) = f(n-1) + f(n-2)
int fib(int n) {
if (n <= 0)
return 0;
else
}
5)优化递归算法:避免重复计算
例如,上述斐波那契数列的递归算法会重复计算一些中间结果,影响效率。可以使用动态规划技术,将算法改为非递归形式。
int f1 = 0, f2 = 1;
for (int i = 2; i <= n; i++) {
f1 = f2;
使用循环避免递归,重复计算可以大大减少,提高效率。
1)分治算法的定义:将原问题分解成若干个规模较小且类似的子问题,递归求解子问题,然后合并各子问题得到原问题的解。
2)分治算法流程:
②将问题分解成若干个规模较小的子问题。
③递归地解决各子问题。
④将各子问题的解合并成原问题的解。
3)分治算法实例:归并排序
归并排序是一种基于分治思想的经典排序算法。
排序流程:
②分别对各子数组递归进行归并排序。
③将已经排序好的各子数组合并成最终的排序结果。
实现源代码:
void mergeSort(int* arr, int left, int right) {
if (left >= right)
while (i <= mid && j <= right)
temp[k++] = arr[i] < arr[j] ? arr[i++] : arr[j++];
temp[k++] = arr[i++];
1) 时间复杂度的概念:指完成算法所需的计算次数或操作次数。时间复杂度是算法的度量标准,通常用“大O符号”表示。
2) 常见时间复杂度分类:
常数阶O(1)
对数阶O(logn)
线性阶O(n)
...
4) 空间复杂度等价于算法的额外空间需求。
附录:实验代码 - 斐波那契数列的递归和循环算法
/* recursive fib */
#include
return fib_r(n-1) + fib_r(n-2);
a = b;
int n;
cout << "Enter an integer: ";