练习
1.1-1 给出现实生活中需要排序的一个例子或者现实生活中需要计算凸壳的一个例子。
在比赛中对参赛者的成绩进行排序,以确定冠亚季军;用栅栏把若干树木围起来,求至少需要多长的栅栏。
1.1-2 除速度外,在真实环境中还可能使用哪些其他有关效率的量度?
空间复杂度。
1.1-3 选择一种你以前已知的数据结构,并讨论其优势和局限。
数组,优势为可以随机读写,劣势为频繁插入删除时时间复杂度高。
1.1-4 前面给出的最短路径与旅行商问题有哪些相似之处?又有哪些不同?
都是寻找最短路径,不同之处在于旅行商问题必须遍历所有的点,且可能有“多辆车”。
1.1-5 提供一个现实生活的问题,其中只有最佳解才行。然后提供一个问题,其中近似最佳的一个解也足够好。
在商品抢购中,假设商品数量为 $n$ ,为保证公平,必须明确确定前 $n$ 名抢购者;在公路网或铁路网中寻找最短路径。
1.2-1 给出在应用层需要算法内容的应用的一个例子,并讨论涉及的算法的功能。
地图应用的路径导航中,算法需要给出不同约束(时间最短,路程最短,收费最少等)下的最优路径。
1.2-2 假设我们正比较插入排序与归并排序在相同机器上的实现。对规模为 $n$ 的输人,插入排序运行 $8n^2$ 步,而归并排序运行 $64n{\rm lg}n$ 步。问对哪些 $n$ 值,插入排序优于归并排序?
解 $8n^2<64n{\rm lg}n$ 得 $n<44$。
1.2-3 $n$ 的最小值为何值时,运行时间为 $100n^2$ 的一个算法在相同机器上快于运行时间为 $2^n$ 的另一个算法?
解 $100n^2<2^n$ 得 $n>14$,$n$ 最小为 $15$。
思考题
1-1 (运行时间的比较)假设求解问题的算法需要 $f(n)$ 毫秒,对下表中的每个函数 $f(n)$ 和时间 $t$,确定可以在时间 $t$ 内求解的问题的最大规模 $n$。
1秒钟 | 1分钟 | 1小时 | 1天 | 1月 | 1年 | 1世纪 | |
${\rm lg}n$ | $1.07✖10^{301}$ | $6.31✖10^{18061}$ | $9.65✖10^{1083707}$ | $4.22✖10^{26008991}$ | $10^{780269748}$ | $10^{9493281943}$ | $10^{949328194325}$ |
$\sqrt{n}$ | $10^6$ | $3.6✖10^9$ | $1.30✖10^{13}$ | $7.46✖10^{15}$ | $6.72✖10^{18}$ | $9.95✖10^{20}$ | $9.95✖10^{24}$ |
$n$ | $1000$ | $60000$ | $3.6✖10^6$ | $8.64✖10^7$ | $2.59✖10^9$ | $3.15✖10^{10}$ | $3.15✖10^{12}$ |
$n{\rm lg}n$ | $140$ | $4895$ | $204094$ | $3.94✖10^6$ | $9.77✖10^7$ | $1.05✖10^9$ | $8.68✖10^{10}$ |
$n^2$ | $31$ | $244$ | $1897$ | $9295$ | $50911$ | $177583$ | $1.77✖10^6$ |
$n^3$ | $10$ | $39$ | $153$ | $442$ | $1373$ | $3159$ | $14664$ |
$2^n$ | $9$ | $15$ | $21$ | $26$ | $31$ | $34$ | $41$ |
$n!$ | $6$ | $8$ | $9$ | $11$ | $12$ | $13$ | $15$ |
1. 解 $f(n)<t$ 即可。
2. 估计 $2^n$ 大小的方法:设 $2^n$ 的位数为 $x$,则有 $2^n<10^x$,$x>{\rm log}_{10}2^n=n{\rm log}_{10}2$。