读《算法导论》的动机
前一段时间,我写了几篇力扣周赛题解,属实力不从心,很多东西讲不清楚,写不出来。
这段时间反思了一下,自认为还是读书太少,故决定读一遍《算法导论》,学习一下大佬们是如何传道解惑的。
这篇博客可能会很长,主要记录一下知识点,学习心得,部分练习题答案等。博客中的代码,统一用 C/C++ 编写。
囿于能力,难免出现错误与不足,欢迎大家斧正~
如果你觉得还不错,欢迎关注我的公众号,一起享受编程的乐趣~
第一章 算法在计算中的作用
练习题
1.1-4
前面给出的最短路径与旅行商问题有哪些相似之处?又有哪些不同?
相同点:两者都是求最短路的距离。
不同点:最短路径只规定了目标点和起始点;旅行商问题还规定了中间的必经点。
1.2-2
假设我们正比较插入排序和归并排序在相同机器上的实现。对规模为 n 的输入,插入排序运行 8 n 2 8n^2 8n2步,而归并排序运行 64 n l g n 64nlgn 64nlgn步。问对哪些 n 值,插入排序优于归并排序。
因为是相同机器,所以单位时间内执行的运算量相同,设为 x 步。
那么得到一个关于运行时间的不等式: 8 n 2 x < 64 n l g n x \frac{8n^2}{x} < \frac{64nlgn}{x} x8n2<x64nlgn
化简一下得: n < 8 l g n n < 8lgn n<8lgn
令
f
(
x
)
=
n
−
8
∗
l
g
n
f(x) = n - 8*lgn
f(x)=n−8∗lgn,函数图像如下:
可知,仅在 n 为 2,3,4,5,6 时,插入排序比归并排序快。
1.2-3
n 的最小值为何值时,运行时间为 100 n 2 100n^2 100n2的算法在相同机器上快于运行时间为 2 n 2^n 2n的另一个算法。
和上一题类似,直接列函数方程: f ( n ) = 100 n 2 − 2 n f(n) = 100n^2 - 2^n f(n)=100n2−2n,
- 当 1 <= n < 15 时,f(n) > 0
- 当 n >= 15 时,f(n) < 0
可得,当 n 最小为 15 时,前者快于后者。