赞
踩
第一章 算法概述
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.分治法的应用
9.斐波那契数列算法
int fibonacci(int n){
if(n<=1)
return 1;
return fibonacci(n-1)+ fibonacci(n-2);
}
10.时间复杂度计算:
第三章 动态规划
1.基本思想:将待求解问题分解成若干个子问题,先求解子问题,再从这些子问题的解得到原问题的解。
2.动态规划与分治法的区别:
与分治法不同,适合于动态规划求解的问题,经分解得到的子问题往往是不独立的。
3.动态规划算法求解步骤
4.基本要素:
5.动态规划、递归、备忘录的区别
6.算法应用
第四章 贪心算法
1.基本思想:总是做出当前看来最好的选择
即使贪心算法不能得到整体最优解,但最终结果却是最优解的很好的近似解
2.基本要素
贪心选择性质
所求问题的整体最优解可以通过一系列局部最优解的选择即贪心选择来达到。
一个问题的最优解包括子问题的最优解。
3.分治、贪心和动态规划
分治 | 动态规划 | 贪心算法 | |
适用类型 | 通用问题 | 优化问题 | 优化问题 |
子问题结构 | 每个子问题不同 | 很多子问题重复(不独立) | 只有一个子问题 |
最优子结构 | 不需要 | 必须满足 | 必须满足 |
子问题数 | 全部子问题都要解决 | 全部子问题都要解决 | 只要解决一个子问题 |
子问题在最优解里 | 全部 | 部分 | 部分 |
选择与求解次序 | 先选择后解决子问题 | 先解决子问题后选择 | 先选择后解决子问题 |
4.算法应用
结束时间早的优先
为什么0-1背包用贪心算法不能求得最优解?
主要原因在于无法保证最终能将背包装满,部分闲置的背包空间使每公斤背包空间的价值降低了。
事实上,在考虑0-1背包问题时,应比较选择该物品和不选择该物品所导致的最终方案,然后再作出最好选择。由此就导出许多互相重叠的子问题。这正是该问题可用动态规划算法求解的另一重要特征。
计算平均码长
Prim和Kruskal算法
第五章 回溯法
1.基本思想:以深度优先方式系统搜索问题解的算法
2.解题步骤:
3.回溯法是一个既带有系统性又带有跳跃性的搜索算法。
4.特征:在搜索过程中动态产生问题的解空间。问题的解空间树是虚拟的,并不需要算法运行时构造一个真正的树结构,在任何时刻,算法只保存从根结点到当前扩展结点的路径。
5.扩展结点:一个正在产生儿子的结点。
6.活结点:一个自身已生成但儿子结点还没有全部生成的结点。
7.死结点:不能再向纵深方向移动的扩展结点。
8.避免无效搜索策略——剪枝函数
9.算法框架
遍历时间O(n!)
10.算法应用
的团。
11.递归回溯(写代码):
viod Backtrack(int t){
if(t>n)
Output(x);
else{
for (int i=f(n,t);i<=g(n,t);i++){
x[t]=h(i);
if(Constraint(t)&&Bound(t))
Backtrack(t+1):
第六章 分支限界法
1.基本思想:以广度优先或最小耗费(最大效益)优先的方式搜索解空间树,搜索过程中,每一个活结点只有一次机会称为当前扩展结点。活结点一旦成为扩展结点,就一次性产生所有儿子结点。
2.回溯法与分支限界法的异同
回溯法更适合找出解空间树中满足约束条件的所有解;
分支限界法更适合找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。
回溯法以深度优先方式搜索解空间树,每个活结点有多个机会成为扩展结点
分支限界法以广度优先或最小耗费优先方式搜索解空间树,每个活结点只有一次机会成为扩展结点,一旦成为扩展结点就一次性产生所有儿子结点。
3.分支限界法算法框架
将活结点表组织成一个队列,按队列先进先出的原则选取下一个结点为当前扩展结点。不搜索已不可行结点为根的子树,因为搜索时结点的处理是跳跃式的,所以无法递归。
将活结点组织成一个优先队列,按优先队列式中规定的结点优先级选取优先级最高的下一个结点成为当前扩展结点。
4.算法应用
另一种是利用结点间的控制关系进行剪枝。两条路径到达同一结点,剪去较长路径所对应的树中的结点为根的子树。
un(见上界)
用变量cn表示与该结点相应的团的顶点数;
level表示结点在子集空间树中所处的层次;
cn +n-level+1作为顶点数上界un的值。
以剩余的所有顶点最小出边费用和作为依据。计算图中每个顶点的最小费用出边并用minout记录。如果所给的有向图中某个顶点没有出边,则该图不可能有回路,算法即告结束。
第七章 随机化算法
1.分类:
数值随机化算法:常用于数值问题的求解,得到的是近似解,精度随运行时间增加而提高;
蒙特卡罗算法:求问题的准确解;
拉斯维加斯算法:不会得到不正确的解;
舍伍德算法:总能求得问题的一个正确解。
2.产生伪随机数最常用的方法:线性同余法
a0=d
an=(ban-1+c) mod m n=1,2,3……
d称为种子,如何选取b、c和m直接关系到随机性能;
3.蒙特卡罗算法:高概率(1/2<p<1)给出正确解(p-1/2,算法的优势),但无法判断具体解是否正确;对于同一个实例,不给出两个不同的正确解答称为该算法是一致的;(p231~233)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。