第一章 算法概述
1.算法:解决问题的一种方法或过程;由若干条指令组成的有穷指令。
2.算法的性质:
- 输入:有零个或多个输入
- 输出:有至少一个输出
- 确定性:每条指令是清晰的、无歧义的
- 有限性:每条指令的执行次数和时间都是有限的
3.算法与程序的区别
- 程序是算法用某种程序设计语言的具体实现
- 程序可以不满足算法的有限性
4.算法复杂性分析
- 算法的复杂性是算法运行所需要的计算机资源的量,需要时间资源的量称为时间复杂性,需要空间资源的量称为空间复杂性
- 三种时间复杂性:最坏情况、最好情况、平均情况
- 可操作性最好且最有实际价值的是最坏情况下的时间复杂性
5.f(N)<=Cg(N), f(N)为上界,反之下界;
6.P类问题:所有可以在多项式时间内求解的判定问题
NP问题:所有非确定性多项式时间可解的判定问题;
7.主定理
第二章 递归与分支策略
1.递归概念:直接或间接调用自身的算法
2.递归函数:用函数自身给出定义的函数
3.递归要素:边界条件、递归方程
4.递归的应用
- 汉诺塔问题
void Hanuo(int n,int a,int b,int c)
{
if(n==1) return;
Hanuo(n-1,a,c,b);
move(a,b)
Hanuo(n-1,c,b,a);
}
- 全排列问题
void Perm(Type list[],int k,int m)
{ //产生list[k,m]的所有排列
if(k == m)
{
for(int i = 0;I <= m;i++) cout<<list[i];
cout<<endl;
}
else
{
for(int i = j; i<=m;i++)
{
Swap(list[k],list[i]);
Perm(list,k+1;m);
Swap(list[k],list[i])
}
}
}
5.分治法的基本思想(简答题):将一个规模较大的问题分成若干个规模相同的较小的子问题,这些子问题互相独立且与原问题相同,一般递归地解决这些子问题,可以将各个子问题的解合并得到原问题的解。
6.分治法的使用条件:
- 问题的规模缩小到一定程度可以容易地解决
- 问题可以分解为若干个规模较小的相同问题
- 利用原问题分解出的子问题的解可以合并为原问题的解
- 各个子问题是相互独立的
7.分治法的时间复杂度
8.分治法的应用
- 二分搜索
- 时间复杂度 O(logn)
- 参考算法
- 快速排序:(步骤:分