算法导论复习资料
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法导论复习资料
一、选择题:第一章的概念、术语。
二、考点分析:
1、复杂度的渐进表示,复杂度分析。
2、正确性证明。
考点:1)正确性分析(冒泡,归并,选择);2)复杂度分析(渐进表示O,Q,©,替换法证明,先猜想,然后给出递归方程)。
循环不变性的三个性质:
1)初始化:它在循环的第一轮迭代开始之前,应该是正确的;
2)保持:如果在循环的某一次迭代开始之前它是正确的,那么,在下一次迭代开始之前,它也应该保持正确;
3)当循环结束时,不变式给了我们一个有用的性质,它有助于表明算法是正确的。
插入排序算法:
INSERTION-SORT(A)
1 for j ←
2 to length[A]
2 do key ←A[j]
3 ▹Insert A[j] into the sorted sequence A[1,j - 1].
4 i ←j - 1
5 while i > 0 and A[i] > key
6 do A[i + 1] ←A[i]
7 i ←i - 1
8 A[i + 1] ←key
插入排序的正确性证明:课本11页。
归并排序算法:课本17页及19页。
归并排序的正确性分析:课本20页。
3、分治法(基本步骤,复杂度分析)。——许多问题都可以递归求解
考点:快速排序,归并排序,渐进排序,例如:12球里面有一个坏球,怎样用最少的次数找出来。(解:共有24种状态,至少称重3次可以找出不同的球)
不是考点:线性时间选择,最接近点对,斯特拉算法求解。
解:基本步骤:
一、分解:将原问题分解成一系列的子问题;
二、解决:递归地解各子问题。若子问题足够小,则直接求解;
三、合并:将子问题的结果合并成原问题的解。
复杂度分析:分分治算法中的递归式是基于基本模式中的三个步骤的,T(n)为一个规模为n的运行时间,得到递归式
T(n)=Q(1) n<=c
T(n)=aT(n/b)+D(n)+C(n) n>c
附加习题:请给出一个运行时间为Q(nlgn)的算法,使之能在给定的一个由n个整数构成的集合S 和另一个整数x时,判断出S中是否存在有两个其和等于x的元素。
4、动态规划(最优子结构性质,自底向上填表计算最优解值(即最长公共子序列),导出最优解)。
考点:最优子结构性质,自底向上填表计算最优解值,导出最优解。
a)动态规划算法设计的4个步骤:1)描述最优解的结构;2)递归定义最优解的值;3)按自底向上的方式计算最优解的值;4)由计算出的结果构造一个最优解。
b)最优子结构遵循的共同模式:1)问题的一个解可以是做一个选择,做这种选择可能会
得到一个或多个有待解决的子问题;2)假设对一个给定的问题,已知的是一个可以导致最优解的选择,不必关心如何确定这个选择,尽管假定它是已知的;3)在已知这个选择后,要确定哪些子问题会随之发生,以及如何最好地描述所得到的子问题的空间;4)利用一种“剪切粘贴法”,来证明在问题的一个最优解中,使用的子问题的解本身也必须是最优的。备注:A problem exhibits optimal substructure if an optimal solution to the problem contains within it optimal solutions
to subproblems.
Whenever a problem exhibits optimal substucture it is a good clue that dynamic programming might apply.
c )最长公共子序列的算法:这里以两个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn}为输入,注意课本211页的自底向上填表方法。
LCS-LENGTH(X, Y) 注:此程序运行时间为O (mn ),每个表项的计算时间为O (1) 1 m ← length[X]
2 n ← length[Y]
3 for i ← 1 to m
4 do c[i, 0] ← 0
5 for j ← 0 to n
6 do c[0, j] ← 0
7 for i ← 1 to m
8 do for j ← 1 to n
9 do if xi = yj
10 then c[i, j] ← c[i - 1, j - 1] + 1
11 b[i, j] ← “="
12 else if c[i - 1, j] ≥ c[i, j - 1]
13 then c[i, j] ← c[i - 1, j]
14 b[i, j] ← "↑"
15 else c[i, j] ← c[i, j - 1]
16 b[i, j] ← " ← "
17 return c and b
PRINT-LCS(b, X, i, j) 注:此程序运行时间为O (m+n )
1 if i = 0 or j = 0
2 then return
3 if b[i, j] = "="
4 then PRINT-LCS(b, X, i - 1, j - 1)
5 print xi
6 elseif b[i, j] = "↑"
7 then PRINT-LCS(b, X, i - 1, j)
8 else PRINT-LCS(b, X, i, j - 1)
d )矩阵链乘法的算法:参照课本上的矩阵链表得出矩阵相乘的最小算法。
}
],1[],[{m in ],[1j k i j
k i p p p j k m k i m j i m -<≤+++=