1. 给出两种以上的原因说明为什么程序分析员对程序的空间复杂性感兴趣?
2. 给出两种以上的原因说明为什么程序分析员对程序的时间复杂性感兴趣?
3. 试采用两种C + +编译器编译同一个C + +程序,所得代码的长度相同吗?
4. 给出可能影响程序空间复杂性的其他因素。
5. 使用图2 - 2所提供的数据来计算如下数组所需要的字节数:
1) int matrix[10][100]
2) double x[100][5][20]
3) long double y[3]
4) float z[10][10][10][5]
5) short z[2][3][4]
6) long double b[3][3][3][3]
6. 程序2 - 2给出了一个在数组a [ 0 : n - 1 ]中查找元素x的递归函数。如果找到x ,则函数返回x在a
中的位置,否则返回-1。试计算SP(n)。
8. 试给出可能影响一个程序时间复杂性的其他因素。
9. 在函数S u m(见程序1 - 8)的f o r循环中会执行多少次加法?
10. 函数F a c t o r i a l(见程序1 - 7)会执行多少次乘法?
11. 修改程序2 - 6 ,把第一个f o r循环后面的代码替换为:释放a所占用的空间并把a更新到u中
去。此外,把参数T a[ ]变成T* &a。为了使新的代码能够运行,对应于a的实际参数必须是一
个动态分配的数组。试测试新的代码。
12. 创建一个输入数组a,使得函数R e a r r a n ge(见程序2 - 11)执行n - 1次元素交换和n - 1次行
交换。
13. 函数A d d(见程序2 - 1 9)中矩阵元素对之间共执行了多少次加法?
14. 函数Tr a n s p o s e(见程序2 - 2 2)共执行了多少次S w a p操作?
15. 试确定函数M u lt(见程序2 - 2 4)共执行了多少次乘法,该函数实现两个n×n矩阵的乘法。
16. 试确定函数Mult (见程序2-25) 共执行了多少次乘法,该函数实现一个m×n矩阵与一个
n×p 矩阵之间的乘法。
17. 试确定函数P e r m (见程序1 - 1 0 )共执行了多少次S w a p操作?
18. 函数M i n M ax(见程序2-26) 用来查找数组a[0:n-1] 中的最大元素和最小元素。令n为实
例特征。试问a 中元素之间的比较次数是多少?程序2 - 2 7中给出了另一个查找最大和最小元素
的函数。在最好和最坏情况下a 中元素之间比较次数分别是多少?试分析两个函数之间的相对
性能。
19. 递归函数S e q u e n t i a l S e a r c h (见程序2 - 2 )中数组a与x 之间共执行了多少次比较?
20. 程序2 - 2 8给出了另外一个迭代式顺序搜索函数。在最坏情况下x 与a中元素之间执行了
多少次比较?把这个比较次数与程序2 - 1中相应的比较次数进行比较,哪一个函数将运行得更
快?为什么?
21.
1) 在程序2 - 2 9中所有合适的位置插入c o u n t计值语句。
2) 通过删除原执行语句对1) 中所得到的程序进行简化。简化后的程序所计算出的c o u n t值
应与1中程序所计算出的c o u n t值相同。
3) 当程序结束时c o u n t的值是多少?可以假定c o u n t的初值为0。
4) 采用频率方法分析程序2 - 2 9的执行步数,列出执行步数表。
22. 分别对如下函数完成练习2 1:
1) Max(见程序1 - 3 1 )。
2) MinMax( 见程序2 - 2 6 )。
3) MinMax(见程序2 - 2 7 ),分析最坏情况下的执行步数。
4) Factorial(见程序1 - 7 )。
5) PolyEval(见程序2 - 3 )。
6) Horner(见程序2 - 4 )。
7) Rank(见程序2 - 5 )。
8) Perm(见程序1 - 1 0 )。
9) SequentialSearch (见程序2 - 2 8 ),分析最坏情况下的执行步数。
10) SelectionSort (见程序2 - 7 ),分析最好和最坏情况下的执行步数。
11) SelectionSort (见程序2 - 1 2 ),分析最好和最坏情况下的执行步数。
12) InsertionSort (见程序2 - 1 4 ),分析最坏情况下的执行步数。
13) InsertionSort (见程序2 - 1 5 ),分析最坏情况下的执行步数。
14) BubbleSort (见程序2 - 9 ),分析最坏情况下的执行步数。
15) BubbleSort (见程序2 - 1 3 ),分析最坏情况下的执行步数。
16) Mult (见程序2 - 2 4 )
23. 对如下函数完成练习2 1中的1、2和3 :
1) Tr a n s p o s e (见程序2 - 2 2 )
2) Inef(见程序2 - 2 3 )
24. 计算如下函数的平均执行步数:
1) SequentialSearch(见程序2 - 2 )
2) SequentialSearch(见程序2 - 2 8 )
3) Insert (见程序2 - 1 0 )
25.
1) 对于程序2 - 2 5完成练习2 1。
2) 在什么条件下适于交换最外层的两个f o r循环?
26. 试比较在最坏情况下,函数S e l e c t i o n S o r t (见程序2 - 1 2 )、函数I n s e r t i o n S o r t (见程序2 - 1 5 )
以及函数Bubble Sort (见程序2-13) 中元素移动的次数。利用程序2 - 11完成按名次排序。请说明
对于大型数组,这两种排序方法之间的相对性能。
27. 在最坏的情况下一个程序所需要的运行时间和内存都必须是最大的吗?证明你的结论。
28. 仅使用O、W、和o的定义来证明如下公式的正确性。不得使用定理2 - 1至2 - 6或图2 -
1 5与2 - 1 6中的等式。
1)
2)
3)
4)
5)
6)
7)
8)
9)
10)
29. 采用定理2-2, 2-4 和2 - 6完成练习2 8。
30. 证明以下等式不成立:
1)
2)
3)
4)
31. 证明定理2 - 3和2 - 5。
32. 证明定理2 - 4和2 - 6。
33. 证明当且仅当l im
n→∞
f (n) /g (n)=0 时f (n) = o(g (n)) 。
34. 证明图2 - 1 5中的等价性E 5至E 8是正确的。
35. 证明图2 - 1 6中的推理规则I 5至I 6是正确的。
36. 下面哪些规则是正确的?为什么?
37. 计算以下函数的渐进复杂性,设计一个类似于图2 - 1 9至2 - 2 2的频率表。
1) Factorial(见程序1 - 7 )
2) MinMax(见程序2 - 2 6 )
3) MinMax( 见程序2 - 2 7 )
4) Mult(见程序2 - 2 4 )
5) Mult(见程序2 - 2 5 )
6) Max(见程序1 - 3 1 )
7) PolyEval(见程序2 - 3 )
8) Horner(见程序2 - 4 )
9) Rank(见程序2 - 5 )
10) Perm(见程序1 - 1 0 )
11) SelectionSort(见程序2 - 7 )
12) SelectionSort (见程序2 - 1 2 )
13) InsertionSort (见程序2 - 1 4 )
14) InsertionSort (见程序2 - 1 5 )
15) BubbleSort (见程序2 - 9 )
16) BubbleSort (见程序2 - 1 3 )
38. 设A和B是执行相同任务的程序,令tA (n) 和tB (n) 分别表示它们的运行时间。对于下面
的每对数据,给出使程序A 比程序B 快的n 的取值范围。
1) tA (n) = 1 0 0 0n,tB (n) = 1 0n2
2) tA (n) = 2n2,tB (n) =n3
3) tA (n) = 2n, tB (n) = 1 0 0n
4) tA (n) = 1 0 0 0nl o g2 n,tB (n) =n2
39. 假定一台计算机每秒能执行1万亿条指令,重新给出图2 - 2 5中的数据。
40. 假定有某个程序和某台计算机,它们可以在“合理的时间”内解决规模为n = N的问题。
建立一个表格来说明,对于同样的程序和速度快x 倍的计算机,能在合理的时间内解决的问题
的最大规模是多少(即最大的n 值)。分别取x= 1 0、1 0 0、1 0 0 0、1 000 000 及tA (n) =n、n2、n3、
n5 和2n 来完成练习。
41. 为什么程序2-31 的误差范围不在1 0 %以内。
42. 利用程序2 - 3 2来获取两个不同的插入排序程序(见程序2 - 1 4和程序2 - 1 5)在最坏情况下
所需要的运行时间。采用与程序2 - 3 2相同的n 值。试比较调用I n s e r t函数以及把I n s e r t函数的代
码合并到排序函数这两种情况下各自的优缺点。
43. 利用程序2 - 3 2来获取两个不同的冒泡排序程序(见程序2 - 9和程序2 - 1 3)在最坏情况
下所需要的运行时间。采用与程序2 - 3 2相同的n 值。不过,你必须证实,程序2 - 3 2中所给出
的测试数据实际上也能使这两种冒泡排序函数产生最坏的复杂性。使用三列表格来给出你的
结果,三列分别是: n、程序2 - 9、程序2 - 1 3。指出在最坏情形下,这两种冒泡排序函数的相
对性能。
44.
1) 对于程序2 - 7和程序2 - 1 2中所给出的两个选择排序函数,设计能产生最坏复杂性的
测试数据。
2) 对2 - 3 2进行适当的修改以测定这两种选择排序函数在最坏情况下所需要的时间。采用与
程序2 - 3 2相同的n 值。
3) 使用三列表格来给出你的结果,三列分别是: n、程序2 - 7、程序2 - 1 2。
4) 指出在最坏情形下,这两种选择排序函数的相对性能。
45. 比较插入排序(见程序2 - 3 4)、选择排序(见程序2 - 1 2)和冒泡排序(见程序2 - 1 3)在
最坏情形下所需要的运行时间。为了一致,把程序2 - 1 3重写为一个函数。
1) 设计能使每种函数产生最坏复杂性的测试数据。
2) 使用1 中的数据及程序2 - 3 2中的测试程序来获取最坏情况下的运行时间。
3) 采用两种形式来描述这些时间:一是采用一个四列的表格,四列分别是: n、选择排序、
冒泡排序、插入排序;二是采用一个显示三条曲线的图(每条曲线对应一种排序方法),图的x
轴代表n 值,y 轴代表时间值。
4) 通过三种排序函数在最坏情形下的性能比较,能得出什么结论?
5) 对于每个n,测量额外的时间,并用图2 - 2 8的表格形式给出测试结果。从2 所得到的时
间中减去这种额外开销,然后给出一个新的时间表和新的图。
6) 在减去额外开销后,在4 中所得到的结论是否发生了变化?
7) 利用已得到的数据,估计每种排序函数对2 0 0 0、4 0 0 0和1 0 0 0 0个元素进行排序,在最坏
情况下所需要的时间。
46. 修改程序2 - 3 2,以便获得I n s e r t i o n S o r t函数(见程序2 - 1 5)的平均运行时间。要求如下:
1) 在每一次while 循环中,对0, 1, ..., n-1 的随机排列进行排序,这种随机排列是由一个随
机排列产生器产生的。如果找不到这样的函数,可以用随机数生成器来编写,或简单地产生一
个n 个数的随机序列。
2) 设置w h i l e循环,使得在一次循环中至少有2 0个随机排列被排序,并且至少需要耗费1 0
个时钟“滴答”。
3) 用耗费的时间除以所排序的随机排列数目,得到平均排序时间。
47. 利用练习4 6中的策略来估算程序2 - 9和2 - 1 3中给出的冒泡排序函数的平均运行时间。采
用与程序2 - 3 2相同的n 值。用表格形式给出测试结果。
48. 利用练习4 6中的策略来估算程序2 - 7和2 - 1 2中给出的选择排序函数的平均运行时间,采
用与程序2 - 3 2相同的n 值。用表格形式给出测试结果。
49. 利用练习4 6中的策略来估算并比较程序2 - 1 2、程序2 - 1 3和2 - 1 5中所给出的排序函数的平
均运行时间,采用与程序2 - 3 2相同的n 值。分别用表格和图的形式给出测试结果。
50. 编写测试程序来确定顺序搜索(见程序2 - 1)和折半搜索(见程序2 - 3 0)在搜索成
功时所需要的平均时间。假定数组中每个元素被搜索的概率相同。用表格和图的形式给出
结果。
51. 编写测试程序来确定顺序搜索(见程序2 - 1)和折半搜索(见程序2 - 3 0)在搜索成功时,
最坏情况下所需要的时间。用表格和图的形式给出结果。
52. 对于n=10, 20, 30, ..., 100,确定函数A d d(见程序2 - 1 9)的运行时间。用表格和图的形
式给出测量结果。
53. 对于n=10, 20, 30, ..., 100,确定函数Tr a n s p o s e(见程序2 - 2 2)的运行时间。用表格和图
的形式给出测量结果。
54. 对于n=10, 20, 30, ..., 100,确定函数M u l t(见程序2 - 2 4)的运行时间。用表格和图的形
式给出测量结果。