写在前面
一边看算法导论一边做题,把自己的答案记录下来一起交流,有不对之处欢迎指正。
仍在录入中
第 1 章
1.1-1
给出现实生活中需要排序的一个例子或者现实生活中需要计算凸包的一个例子。
按字典序排列列表,或按姓名首字母排序人名。
1.1-2
除速度外,在真实环境中还可能使用哪些其他有关效率的量度。
比如内存占用率、资源利用率等。
1.1-3
选择一种你以前已知的数据结构,并讨论其优势和局限。
以数组为例:
优点是 随机访问效率高,查找速度快
缺点是 插入及删除效率较低,必须连续内存空间,不能动态扩展
1.1-4
前面给出的最短路径与旅行商问题有哪些相似之处?又有哪些不同?
相似之处在于都是在图中找到一条路径。
不同之处在于最短路径只关心两地之间的路径,而旅行商问题得到返回第一个点的许多路径。
1.1-5
提供一个现实生活的问题,其中只有最佳解才行。然后提供一个问题,其中近似最佳的一个解也足够好。
还以姓名首字母排序为例,只有一种排列结果,同时也是最佳解。
以背包问题为例,使用贪心算法可得到一个足够好的解。
1.2-1
给出在应用层需要算法内容的应用的一个例子,并讨论涉及的算法的功能。
百度搜索一个词条的结果,其中涉及到多种算法,比如数据库的查找、结果的排序以及各种推荐的算法。
1.2-2
假设我们正比较插入排序与归并排序在相同机器上的实现。对规模为 n n n 的输入,插入排序运行 8 n 2 8n^{2} 8n2 步,而归并排序运行 64 n l g n 64nlgn 64nlgn 步。问对哪些 n n n 值,插入排序优于归并排序?
对两个函数比较可得,当规模 2 < = n < = 43 2<=n<=43 2<=n<=43时,插入排序优于归并排序。
1.2-3
n n n的最小值为何值时,运行时间为 100 n 2 100n^{2} 100n2 的一个算法在相同机器上快于运行时间为 2 n 2^{n} 2n 的另一个算法?
最小值为15的时候。
思考题 1-1
略
第 2 章
2.1-1
以图2-2为模型,说明INSERTION-SORT在数组 A = { 31 , 41 , 59 , 26 , 41 , 58 } A=\{31, 41, 59, 26, 41, 58\} A={ 31,41,59,26,41,58} 上的执行过程。
略
2.1-2
重写过程INSERTION-SORT,使之按非升序(而不是非降序)排序。
for j = 2 to A.length
key = A[j]
i = j - 1
while i > 0 and A[i] < key
A[i + 1] = A[i]
i = i - 1
A[i + 1] = key
2.1-3
略
2.1-4
ADD-BINARY(A, B):
C = new int[A.length + 1]
local carry = 0
for i = 1 to A.length
C[i] = (A[i] + B[i] + carry) % 2
carry = (A[i] + B[i] + carry) / 2
C[i] = carry
return C
2.2-1
用 Θ \Theta Θ 记号表示函数 n 3 / 1000 − 100 n 2 − 100 n + 3 n^{3}/1000-100n^{2}-100n+3 n3/1000−100n2−100n+3 。
Θ ( n 3 ) \Theta(n^{3}) Θ(n3)
2.2-2
略
2.2-3
平均情况下会检查一半左右的元素,最坏情况下会检查所有元素,所以时间分别为 n / 2 n / 2 n/2 和 n n n ,都是 Θ ( n ) \Theta(n) Θ(n)
2.2-4
应如何修改任何一个算法,才能使之具有良好的最好情况运行时间?
通过对子问题使用更高效的处理方法。
2.3-1
使用图2-4作为模型,说明归并排序在数组 A = {