《数据结构算法与应用-C++语言描述》第二章练习题 程序性能

 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)的运行时间。用表格和图的形
式给出测量结果。

Data Structures, Algorithms, and Applications in C++, Second Edition 出版者的话 译者序 前言 第一部分 预备知识 第1章 C++回顾 1.1 引言 1.2 函数与参数 1.2.1 传值参数 1.2.2 模板函数 1.2.3 引用参数 1.2.4 常量引用参数 1.2.5 返回值 1.2.6 重载函数 1.3 异常 1.3.1 抛出异常 1.3.2 处理异常 1.4 动态存储空间分配 1.4.1 操作符new 1.4.2 一维数组 1.4.3 异常处理 1.4.4 操作符delete 1.4.5 二维数组 1.5 自有数据类型 1.5.1 类currency 1.5.2 一种不同的描述方法 1.5.3 操作符重载 1.5.4 友元和保护性类成员 1.5.5 增加#ifndef、#define和#endif语句 1.6 异常类illegalParameterValue 1.7 递归函数 1.7.1 递归的数学函数 1.7.2 归纳 1.7.3 C++递归函数 1.8 标准模板库 1.9 测试与调 1.9.1 什么是测试 1.9.2 测试数据的设计 1.9.3 调 1.10 参考及推荐读物 第2章 程序性能分析 2.1 什么是程序性能 2.2 空间复杂度 2.2.1 空间复杂度的组成 2.2.2 举例 2.3 时间复杂度 2.3.1 时间复杂度的组成 2.3.2 操作计数 2.3.3 最好、最坏和平均操作计数 2.3.4 步数 第3章 渐近记法 3.1 引言 3.2 渐近记法 3.2.1 大Ο记法 3.2.2 渐近记法Ω和Θ 3.3 渐近数学(可选) 3.3.1 大O记法 3.3.2 Ω记法 3.3.3 Θ记法 3.3.4 小ο记法 3.3.5 特性 3.4 复杂度分析举例 3.5 实际复杂度 3.6 参考及推荐读物 第4章 性能测量 4.1 引言 4.2 选择实例的大小 4.3 设计测试数据 4.4 实验设计 4.5 高速缓存 4.5.1 简单计算机模型 4.5.2 缓存未命中对运行时间的影响 4.5.3 矩阵乘法 4.6 参考及推荐读物 第二部分 数据结构 第5章 线性表——数组描述 5.1 数据对象和数据结构 5.2 线性表数据结构 5.2.1 抽象数据类型linearList 5.2.2 抽象类linearList 5.3 数组描述 5.3.1 描述 5.3.2 变长一维数组 5.3.3 类arrayList 5.3.4 C++迭代器 5.3.5 arrayList的一个迭代器 5.4 vector的描述 5.5 在一个数组中实现的多重表 5.6 性能测量 5.7 参考及推荐读物 第6章 线性表——链式描述 6.1 单向链表 6.1.1 描述 6.1.2 结构chainNode 6.1.3 类chain 6.1.4 抽象数据类型linearList的扩充 6.1.5 类extendedChain 6.1.6 性能测量 6.2 循环链表和头节点 6.3 双向链表 6.4 链表用到的词汇表 6.5 应用 6.5.1 箱子排序 6.5.2 基数排序 6.5.3 凸包 6.5.4 并查集 第7章 数组和矩阵 7.1 数组 7.1.1 抽象数据类型 7.1.2 C++数组的索引 7.1.3 行主映射和列主映射 7.1.4 用数组的数组来描述 7.1.5 行主描述和列主描述 7.1.6 不规则二维数组 7.2 矩阵 7.2.1 定义和操作 7.2.2 类matrix 7.3 特殊矩阵 7.3.1 定义和应用 7.3.2 对角矩阵 7.3.3 三对角矩阵 7.3.4 三角矩阵 7.3.5 对称矩阵 7.4 稀疏矩阵 7.4.1 基本概念 7.4.2 用单个线性表描述 7.4.3 用多个线性表描述 7.4.4 性能测量 第8章 栈 8.1 定义和应用 8.2 抽象数据类型 8.3 数组描述 8.3.1 作为一个派生类实现 8.3.2 类arrayStack 8.3.3 性能测量 8.4 链表描述 8.4.1 类derivedLinkedStack 8.4.2 类linkedStack 8.4.3 性能测量 8.5 应用 8.5.1 括号匹配 8.5.2 汉诺塔 8.5.3 列车车厢重排 8.5.4 开关盒布线 8.5.5 离线等价类问题 8.5.6 迷宫老鼠 8.6 参考及推荐读物 第9章 队列 9.1 定义和应用 9.2 抽象数据类型 9.3 数组描述 9.3.1 描述 9.3.2 类arrayQueue 9.4 链表描述 9.5 应用 9.5.1 列车车厢重排 9.5.2 电路布线 9.5.3 图元识别 9.5.4 工厂仿真 9.6 参考及推荐读物 第10章
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值