算法复习整理(呕心之作)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《算法设计与分析》复习提纲2011.06.12
1 引言(ch1)
1.什么是算法及其特征
算法是通过一系列有限的指令集构成的对特定问题进行求解的计算机执行描述。
算法特征:输入、输出、有限性、确定性、通用性
2.问题实例和问题规模
问题实例:解决一个问题所需要的所有输入
问题规模:算法输入实例的大小
2 算法初步(ch2)
1.插入排序算法
INSERT_SORT(A)
for j<-2 to length[A]
Do key<-A[j]//将A[j]插入到已排序的数列A[1..j-1]
i<-j-1
while i>0 and A[i]>key
do A[i+1]<-A[i]//给A[j]腾出位置
i<-i-1
A[i+1]<-key//找到位置插入key
2.算法复杂性及其度量
(1)时间复杂性和空间复杂性;
一个算法所需要的时间通常和输入的规模成同步增长,所以我们通常把算法运行的时间写成输入规模的某种形式,称为时间复杂度。
算法的空间复杂度通常是指算法所需要的内存存储空间的大小的量级,通常也写成输入规模的某种形式。
(2)最坏、最好和平均情形复杂性;
算法的最坏运行时间是指在任何输入情况下运行时间的一个上界。最好的复杂度是指在任何输入情况下运行时间的一个下界。平均时间复杂度是指算法运行时间的数学期望。
3.插入排序的最坏、最好和平均时间
插入排序的最坏时间复杂度是O(n2)发生在输入是逆序的情况下,最好时间复杂度是O(n)发生输入是顺序的情况下。平均时间复杂度同O(n2)。
3.归并排序算法及其时间复杂性
MERGE(A,p,q,r)//将两个排好序的数组合并
n1 <-q-p+1
n2<-r-q//r-(q+1)+1
create arrays L[1..n1+1] and R[1..n2+1]//建立两个数组
for i<-1 to n1
do L[i]<-A[p+i-1]
for j<-1 to n2
do R[j]<-A[q+j]//A[(q+1)+j-1]
L[n1+1]<-max//Max表示无穷大
L[n2+1]<-max//用作哨兵
i<-1
j<-1
for k<-p to r
do if L[i]<=R[j]
then A[k]<-L[i]
i<-i+1
else A[k]<-R[j]
j<-j+1
MERGE-SORT(A,p,r)//归并排序采用分治发,分解+解决+合并
if p then q<-(p+r)/2//下取整,分解 MERGE-SORT(A,p,q)//解决一半 MERGE-SORT(A,q+1,r)//解决另一半 MERGE(A,p,q,r)//合并 时间复杂度为O(nlogn) 3函数增长率(ch3) 1.渐近记号O、Ω、θ的定义及其使用 θ:渐紧界,即存在n0,c1,c2,当n>n0时有c1g(n)= O:渐进上界,即存在n0,c当n>n0时有0= 2.标准复杂性函数及其大小关系 (1)多项式时间阶的大小 O(1) (2)指数时间阶的大小 O(2n) 3.和式界的证明方法 (1)数学归纳法,先猜,后用数学归纳法按照界的证明方法证明(求c和n0) (2)对项进行限界:利用最大、最小值进行放缩,以及利用和式的前后两项比 值小于1进行几何级数的限界。 (3)和式分解 a.简单的分解 b.忽略和式初始几项 c.更复杂的划分,要充分考虑和式的规律性 d.积分近似(分为f(k)单调递增和递减两种情况)可用于求紧致界 e.Knuth求和的七种方法 4 递归关系式(ch4) 1.替换法 (1)猜测解 数学归纳法证明; 注: a.出现T(n/2)的情况下要假设T(n/2)符合条件,继而得到T(n)符合条件 b.不要忘记证明归纳基础(n=1、n=2直到找到一个n0,使得对n>n0时候一切 都符合猜测的结论) c.有时候得到T(n)<=cn+1的时候需要在猜测解中减去一个低阶项,凑成 T(n)<=cn (2)变量变换法; 替换使式子变形为已知的熟悉的形式。如T(n)=2T(n/2)+n 2.迭代法 (1)展开法;关键是处理通项等于1的情况,也就是递归结束的情况。 (2)递归树法;主要关注Runing time(同一层上所有节点的时间和)和size(原 来的几分之几)两个指标,选取size最慢到1的分支为标准(分支最长的)。 3.主定理 Case 3 的时候不要忘记证明af(b/n)<=cf(n)对某个c<1且足够大的n成立。 5 概率分析(ch5) 1.雇佣问题及其随机算法(略) 2.序列随机排列的两种方法及其复杂性 方法1:为每个A[i]指定一个优先级p[i]然后按p[i]对A排序 PermuteBySort() { n<-length[A]; for(i=1;i<=n;i++) p[i]<-Random(1~n3); 用p作为关键字对A 排序; Return A; } 时间复杂度:θ(nlogn)//主要用在排序上,归并排序的时间复杂度是 O(nlogn) 方法2:就地枚举 RandomInPlace(A) { n<-length[A]; for(i=1;i<=n;i++) A[i]<->A[Random(1,n)];//直接就地生成优先级后就交换位置 } 时间复杂度:θ(n) 3.online雇佣问题及其概率分析(略)