算法导论复习资料

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 -<≤+++=

相关文档
最新文档