算法分析与设计 期末复习
第一章 时间复杂度
第二章 递归与分治策略
第二章 递归与分治策略
1.分治法的基本思想:
分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各子问题的解合并得到原问题的解。
2.二分搜索技术——C语言实现
//用函数封装
#include <stdio.h>
binary_search(int a[], int k,int sz)
{
int left = 0;
int right = sz;
int mid = 0;
while (left <= right)
{
mid = (left + right )/ 2;
if (a[mid] < k)
{
left = mid + 1;
}
else if (a[mid]>k)
{
right = mid - 1;
}
else
{
return mid;
}
}
return - 1;
}
int main()
{
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int key = 7;
int sz = sizeof(a) / sizeof(a[0])-1;
int ret = binary_search(a, key,sz);
if (ret == -1)
{
printf("找不到");
}
else
{
printf("找到了,下标是:%d",ret);
}
return 0;
}
第三章 动态规划
1.动态规划的基本思想:
动态规划的基本思想是将待求解问题分解成若干子问题,先求解子问题,再结合这些子问题的解得到原问题的解。
2.动态规划算法的基本要素:
- 最优子结构:
当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。
在动态规划算法中,利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解。 - 重叠子问题
在用递归算法自顶向下求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只解一次,而后将其解保存在一个表格中,当再次需要此子问题时,只要简单地用常数时间查看一下结果。通常,不同的子问题个数随问题的大小呈多项式增长。因此,用动态规划算法通常只需要多项式时间,从而获得较高的解题效率。
3.最长公共子序列
最长公共子序列——csdn博客
4.最大子段和
最大字段和——csdn博客
第四章 贪心算法
1.贪心算法的概念:
贪心算法总是做出在当前看来最好的选择。也就是说,贪心算法并不从整体最优上加以考虑,所做的选择只是在某种意义上的局部最优选择
2.贪心算法的基本要素:
- 贪心选择性质
是指问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。 - 最优子结构性质
当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质
3.哈夫曼编码
4.最小生成树
第五章 回溯法
1.回溯法的概念:
分支限界法
1.分支限界法的基本思想