算法导论(第3版)习题答案

  • 写在前面
    • 第 1 章
      • 1.1-1
      • 1.1-2
      • 1.1-3
      • 1.1-4
      • 1.1-5
      • 1.2-1
      • 1.2-2
      • 1.2-3
      • 思考题 1-1
    • 第 2 章
      • 2.1-1
      • 2.1-2
      • 2.1-3
      • 2.1-4
      • 2.2-1
      • 2.2-2
      • 2.2-3
      • 2.2-4
      • 2.3-1
      • 2.3-2
      • 2.3-3
      • 2.3-4
      • 2.3-5
      • 2.3-6
      • 2.3-7
      • 思考题2-1
      • 2-2
      • 2-3
      • 2-4
    • 第 3 章
      • 3.1-1
      • 3.1-2
      • 3.1-3
      • 3.1-4
      • 3.1-5
      • 3.1-6
      • 3.1-7
      • 3.1-8
      • 3.2-1
      • 3.2-2
      • 3.2-3
      • 3.2-4
      • 3.2-5
      • 3.2-6
      • 3.2-7
      • 3.2-8
      • 思考题3-1
      • 3-2
      • 3-3
      • 3-4
      • 3-5
      • 3-6
    • 第4章
      • 4.1-1

写在前面

一边看算法导论一边做题,把自己的答案记录下来一起交流,有不对之处欢迎指正。


仍在录入中


第 1 章

1.1-1

给出现实生活中需要排序的一个例子或者现实生活中需要计算凸包的一个例子。

按字典序排列列表,或按姓名首字母排序人名。

1.1-2

除速度外,在真实环境中还可能使用哪些其他有关效率的量度。

比如内存占用率、资源利用率等。

1.1-3

选择一种你以前已知的数据结构,并讨论其优势和局限。

以数组为例:
优点是 随机访问效率高,查找速度快
缺点是 插入及删除效率较低,必须连续内存空间,不能动态扩展

1.1-4

前面给出的最短路径与旅行商问题有哪些相似之处?又有哪些不同?

相似之处在于都是在图中找到一条路径。
不同之处在于最短路径只关心两地之间的路径,而旅行商问题得到返回第一个点的许多路径。

1.1-5

提供一个现实生活的问题,其中只有最佳解才行。然后提供一个问题,其中近似最佳的一个解也足够好。

还以姓名首字母排序为例,只有一种排列结果,同时也是最佳解。
以背包问题为例,使用贪心算法可得到一个足够好的解。

1.2-1

给出在应用层需要算法内容的应用的一个例子,并讨论涉及的算法的功能。

百度搜索一个词条的结果,其中涉及到多种算法,比如数据库的查找、结果的排序以及各种推荐的算法。

1.2-2

假设我们正比较插入排序与归并排序在相同机器上的实现。对规模为 nnn 的输入,插入排序运行 8n28n^{2}8n2 步,而归并排序运行 64nlgn64nlgn64nlgn 步。问对哪些 nnn 值,插入排序优于归并排序?

对两个函数比较可得,当规模2<=n<=432<=n<=432<=n<=43时,插入排序优于归并排序。

1.2-3

nnn的最小值为何值时,运行时间为 100n2100n^{2}100n2 的一个算法在相同机器上快于运行时间为 2n2^{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.lengthkey = A[j]i = j - 1while i > 0 and A[i] < keyA[i + 1] = A[i]i = i - 1A[i + 1] = key

2.1-3

2.1-4

ADD-BINARY(A, B):C = new int[A.length + 1]local carry = 0for i = 1 to A.lengthC[i] = (A[i] + B[i] + carry) % 2carry = (A[i] + B[i] + carry) / 2C[i] = carryreturn C

2.2-1

用 Θ\ThetaΘ 记号表示函数 n3/1000−100n2−100n+3n^{3}/1000-100n^{2}-100n+3n3/1000−100n2−100n+3 。

Θ(n3)\Theta(n^{3})Θ(n3)

2.2-2

2.2-3

平均情况下会检查一半左右的元素,最坏情况下会检查所有元素,所以时间分别为 n/2n / 2n/2 和 nnn ,都是 Θ(n)\Theta(n)Θ(n)

2.2-4

应如何修改任何一个算法,才能使之具有良好的最好情况运行时间?

通过对子问题使用更高效的处理方法。

2.3-1

使用图2-4作为模型,说明归并排序在数组 A={3,41,52,26,38,57,9,49}A=\{3, 41, 52, 26,38,57,9,49\}A={3,41,52,26,38,57,9,49} 上的操作

暂略

2.3-2

2.3-3

首先当 n=2=21n=2=2^{1}n=2=21 时,T(n)=T(2)=2=2lg2=nlgnT(n) =T(2)=2=2lg2=nlgnT(n)=T(2)=2=2lg2=nlgn 成立,对任意 n=2k(k>1)n=2^{k}(k>1)n=2k(k>1) ,如果有 T(n)=nlgnT(n)=nlgnT(n)=nlgn ,那么 T(2n)=2T(n)+2n=2nlgn+2n=2n(lgn+1)=2nlg(2n)T(2n)=2T(n)+2n=2nlgn+2n=2n(lgn+1)=2nlg(2n)T(2n)=2T(n)+2n=2nlgn+2n=2n(lgn+1)=2nlg(2n) ,推论依然成立,所以当nnn刚好是2的幂时,递归式的解是T(n)=nlgnT(n)=nlgnT(n)=nlgn 。

2.3-4

T(n)={Θ(1)若n=1T(n−1)+cn其他.T(n)=\begin{cases}\Theta(1)&若n=1\\T(n-1)+cn&其他\end{cases}.T(n)={Θ(1)T(n−1)+cn​若n=1其他​.
cncncn 是在已经排序的数组中插入的时间。

2.3-5

伪代码如下:

BINARY-SEARCH(A, x):low = 1high = A.lengthwhile low <= high domid = (low + high) / 2if A[mid] == x thenreturn midelseif A[mid] < x thenlow = mid +1elsehigh = mid - 1

很容易得出递归式为 T(n+1)=T(n/2)+cT(n +1) = T(n / 2) + cT(n+1)=T(n/2)+c ,易证运行时间是 Θ(lgn)\Theta(lgn)Θ(lgn)

2.3-6

二分查找并不会将最坏情况下总时间改进到 Θ(nlgn)\Theta(nlgn)Θ(nlgn) ,虽然二分查找会减少比较的次数,但是仍然需要将数组元素进行后移,最坏情况下是线性过程。

2.3-7

伪代码如下:

SUM-FIND(S, x)MERGE-SORT(S, 1, S.length)for i = 1 to S.length doif BINARY-SEARCH(S, x - S[i]) ~= nil thenreturn truereturn false

思考题2-1

a. 由于插入排序最坏情况下的运行时间为 Θ(n2)\Theta(n^{2})Θ(n2) ,则长度为 kkk 时,运行时间可以表示为 T(k)=ak2+bk+cT(k)=ak^{2}+bk+cT(k)=ak2+bk+c ,n/kn/kn/k 个所用时间即为 T=n/k(ak2+bk+c)=ank+bn+cn/k=Θ(nk)T=n/k(ak^{2}+bk+c)=ank+bn+cn/k=\Theta(nk)T=n/k(ak2+bk+c)=ank+bn+cn/k=Θ(nk) ,命题得证。
b. 易知递归式为
T(a)={0若a=1T(a/2)+ak若a=2T(a)=\begin{cases}0&若a=1\\T(a/2)+ak&若a=2\end{cases}T(a)={0T(a/2)+ak​若a=1若a=2​, 经归纳可得T(a)=aklgaT(a)=aklgaT(a)=aklga ,将 n/kn/kn/k 代入可得,T(n/k)=nlg(n/k)T(n/k)=nlg(n/k)T(n/k)=nlg(n/k), 即 n/kn/kn/k为2的幂的情况下,合并的时间为 Θ(nlg(n/k))\Theta(nlg(n/k))Θ(nlg(n/k))
c.

2-2

a. 还需要证明 A′A'A′ 中的所有元素就是 AAA 中的各个元素。

2-3

a. 显然,代码段的运行时间是 Θ(n)\Theta(n)Θ(n)
b. 嵌套循环乘加即可,时间是 Θ(n2)\Theta(n^2)Θ(n2),所以会慢 。

2-4

a. 五个逆序对如下:
<2,1>,<3,1>,<8,6>,<8,1>,<6,1><2, 1>, <3, 1>, <8, 6>,<8, 1>,<6, 1><2,1>,<3,1>,<8,6>,<8,1>,<6,1>
b. 该数组的反向数组有最多的逆序对,为 n(n−1)/2n(n-1)/2n(n−1)/2 个

第 3 章

3.1-1

3.1-2

将左边展开得到 (n+a)b=nb+...+ab(n+a)^b = n^b + ... + a^b(n+a)b=nb+...+ab ,关键项则为 nbn^bnb ,显然命题得证。

3.1-3

大 OOO 表示法表达的是上界,至少说明的是下界。

3.1-4

成立,可以取出一个 222 当做常数项。
不成立,因为不存在一个数使得 2n∗2n<=c2n2^n*2^n<=c2^n2n∗2n<=c2n

3.1-5

3.1-6

3.1-7

3.1-8

3.2-1

3.2-2

alogbc=alogac/logab=(alogac)1/logab=clogbaa^{logbc} = a^{logac / logab} = (a^{logac}) ^{1 / logab} = c^{logba}alogbc=alogac/logab=(alogac)1/logab=clogba

3.2-3

3.2-4

3.2-5

后者更大,因为 lg∗(lgn)=lg∗n−1>lg(lg∗n)lg^*(lgn) = lg^*n - 1 > lg(lg^*n)lg∗(lgn)=lg∗n−1>lg(lg∗n)

3.2-6

3.2-7

简单代入或对方程使用一元二次方程求根公式都易证。

3.2-8

思考题3-1

3-2

a. 是 是 否 否 否
b. 是 是 否 否 否
c. 否 否 否 否 否
d. 否 否 是 是 否
e. 是 否 是 否 是
f. 是 否 是 否 是

3-3

3-4

3-5

3-6

第4章

4.1-1

算法导论第三版习题及答案相关推荐

  1. 算法导论第三版2.3答案

    算法导论第三版2.3答案 2.3 算法导论第三版2.3答案 2.3-1 2.3-2 2.3-3 2.3-4 2.3-5 2.3-6 2.3-7 汇总传送门 2.3-1 划分: {3}, {41}, { ...

  2. 算法导论第三版2.2答案

    算法导论第三版2.2答案 2.2 算法导论第三版2.2答案 2.2-1 2.2-2 2.2-3 2.2-4 汇总传送门 2.2-1 O(n3)O(n^3)O(n3) 2.2-2 /* * @Autho ...

  3. 算法导论第三版3.1答案

    算法导论第三版3.1答案 这一章数学公式实在太多了..打不过来,为了节约时间就用纸笔写了. 2.2 算法导论第三版3.1答案 汇总传送门 汇总传送门 链接: [算法导论习题答案汇总]

  4. 算法导论第三版2.1答案

    算法导论第三版2.1答案 2.1 算法导论第三版2.1答案 2.1-1 2.1-2 2.1-3 2.1-4 2.1-1 插入排序是随着循环逐渐有序的过程,按照这个写. 答案: {31, 41, 59, ...

  5. 算法导论第三版习题4.5

    4.5-1 a f(n)=1,nlogba=nlog42=n12f(n)=1,n^{log_b a} = n^{log_4 2} = n^{\frac{1}{2}} 当0<ϵ≤12时,f(n)= ...

  6. 算法导论第三版习题6.4

    6.4-1 (a) 首先调用BUILD-MAX-HEAP(A)得到最大堆A1={25,13,20,8,7,13,2,5,4}A_1=\{25,13,20,8,7,13,2,5,4\} (b) 然后将A ...

  7. 算法导论第三版习题4.3

    4.3-1 假设对∀m≤n0,∃c≥0,\forall m\le n_0,\exists c\ge0,使得: T(m)≤cm2 \begin{align} T(m) \le cm^2 \end{ali ...

  8. 算法导论第三版3.2答案

  9. 算法导论第三版第二章思考题答案

    算法导论第三版第二章思考题答案 第二章思考题 算法导论第三版第二章思考题答案 2.1 2.2 2.3 2.4 汇总传送门 2.1 #include<iostream> using name ...

  10. 给出TREE_INSERT过程的非递归版本(算法导论第三版12.3-1)

    给出TREE_INSERT过程的非递归版本(算法导论第三版12.3-1) template<typename T> void insert_recursive(BinaryTree< ...

最新文章

  1. Express请求处理-GET和POST请求参数的获取
  2. step4 . day4 库函数和库函数的制作
  3. cs文件中控制页面table的大小、title名称(.aspx)
  4. Android中使用官方提供好的功能使用说明(比如系统图库获取),也作为延生学习的学习文档
  5. mysql查询 百万_MySQL百万级数据分页查询优化
  6. [NOI2014]魔法森林
  7. 对于algorithm102的总结
  8. count(1),count(*)与count(列名)到底有什么区别?
  9. C语言实战--解二元一次方程
  10. 屏保程序学中玩(下)
  11. 热传导方程差分格式 matlab,热传导方程向后差分格式的MATLAB程序
  12. 整数转罗马数字 + 逆向(Python)
  13. 赛季更新服务器维修,12月30日第一赛季结束 夺神之权服务器停机维护公告
  14. 如何在1到100的整数数组中找到缺失的数字
  15. AutoRunner4.5结合真实项目crm客户管理系统进行界面功能自动化测试教学资料(登录)
  16. 计算机光线太强哪里调整,电脑光线太强怎么调暗
  17. Flutter 跨平台框架应用实战-2019极光开发者大会
  18. imx8qxp DDR Test
  19. BP神经网络分类问题(含matlab仿真)
  20. 藻红蛋白/牛血清蛋白/β2-微球蛋白修饰二氧化硅微球偶联免疫球蛋白(IgG)的制备

热门文章

  1. 华为第1书:《华为交换机学习指南》全面预售中
  2. pdg转pdf的正确方法!!
  3. win10 64位下Oracle10g安装
  4. Silverlight实现文件的下载[很简单]
  5. HTML前端在线购书商城,基于HTML css的商城购物前端模板
  6. 手把手教你架构3D引擎高级篇系列八
  7. python零基础怎么学英语最快_零基础如何快速成为Python高手
  8. 搭载自研芯片马里亚纳 MariSilicon X,OPPO Find X5系列正式发布
  9. 俄罗斯地名 中文 英文 俄文
  10. 花生壳 Linux arm