算法分析与设计及案例习题解析

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

习题解析

第1章

1. 解析:

算法主要是指求解问题的方法。计算机中的算法是求解问题的方法在计算机上的实现。

2. 解析:

算法的五大特征是确定性、有穷性、输入、输出和可行性。

3. 解析:

计算的算法,其中n是正整数。可以取循环变量i的值从1开始,算i的平方,取平方值最接近且小于或者等于n的i即可。

4. 解析:

可以使用反证法,设i=gcd(m, n)=gcd(n, m mod n),则设m=a*i,n=b*i,且a与b互质,这时m mod n=(a-x*b)*i,只需要证明b和a-x*b互质,假设二者不互质,可以推出a与b 不互质,因此可以得到证明。

5. 解析:

自然语言描述:十进制整数转换为二进制整数采用“除2取余,逆序排列”法。

具体做法是:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为0时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。

流程图:如图*.1

图*.1 十进制整数转换成二进制整数流程图

6. 解析:

a.如果线性表是数组,则可以进行随机查找。由于有序,因此可以进行折半查找,这样可以在最少的比较次数下完成查找。

b.如果线性表是链表,虽然有序,则只能进行顺序查找,从链表头部开始进行比较,当发现当前节点的值大于待查找元素值,则查找失败。

7. 解析:

本题主要是举例让大家了解算法的精确性。过程中不能有含糊不清或者二义性的步骤。大家根据可行的方式总结一下阅读一本书的过程即可。

8. 解析:

数据结构中介绍的字典是一种抽象数据结构,由一组键值对组成,各个键值对的键各不相同,程序可以将新的键值对添加到字典中,或者基于键进行查找、更新或删除等操作。由于本题已知元素唯一,因此大家可以据此建立一个自己的字典结构。实现字典的方法有很多种:

•最简单的就是使用链表或数组,但是这种方式只适用于元素个数不多的情况下;

•要兼顾高效和简单性,可以使用哈希表;

•如果追求更为稳定的性能特征,并且希望高效地实现排序操作的话,则可以使用更为复杂的平衡树。

在字典之上的主要操作可以有:创建操作,添加操作,删除操作,查找操作,以及必要的字典维护操作。

第2章

1. 解析:

根据本章所述,递归算法和非递归算法的数学分析方法分为5个步骤。 2. 解析:

本题相当于对多项式找“主项”,也就是在除去常系数外,影响函数值递增速度最快的项。

a)

22310()n n n θ+∈

b)

2

2(2)10

n n n θ+∈ c) 1

21()c n θ+∈,c 为常数

d)

32log (log )n n θ∈

e) 10log 3()n

n θ∈ 3. 解析:

本题中如果手套分左右手,则最优情况选2只,最差情况选12只。 本题中如果手套不分左右手,则最优情况仍然选2只,最差情况选4只。

从本题的初衷推测设置题目应该是分左右手的手套,在考虑颜色的情况下,选择一双进行匹配。 4. 解析:

本题的一般解法可以使用高等数学中求二者比值的极限来确定结果。 a) 相同 b) 第一个小 c) 二者相同 d) 第一个大 e) 二者相同 f) 第一个小 5. 解析:

6. 解析:

参见本章例2.7。

第3章

1. 解析:

蛮力法主要依靠问题的定义,采用简单直接的求解方法。由此决定了蛮力法是解决问题的最简单也是最普遍的算法,同时其经常作为简单问题求解的方法和衡量其他算法的依据。

2. 解析:

2,6,1,4,5,3,2

选择排序:

|2 6 1 4 5 3 2i=0: min最后得2,交换二者。

1 |6

2 4 5

3 2 i=1: min最后得2,交换二者。

1 2 |6 4 5 3 2i=2: min最后得6,交换二者。

1 2 2 |4 5 3 6 i=3: min最后得5,交换二者。

1 2 2 3 |5 4 6 i=4: min最后得5,交换二者

1 2 2 3 4 |56i=5: min最后得5。

1 2 2 3 4 5 |6结束。

冒泡排序:

2 6 1 4 5

3 2

2 1 4 5

3 2 |6 i=0: 最大值6就位。

1 2 4 3 2 |5 6 i=1:第二大值5就位。

1 2 3 2 |4 5 6 i=2:第三大值4就位。

1 2 2 |3 4 5 6 i=3:第四大值3就位。

1 2 |2 3 4 5 6 i=4:第五大值2就位。

1 |

2 2

3

4

5

6 i=5:第六大值2就位,剩余的1也就位,排序结束。

3. 解析:

选择排序不稳定,如3.1.1节例子:4,4,2。冒泡排序稳定。

4. 解析:

如2题例子,到i=4时就没有发生交换的活动了。这时可以在冒泡排序的交换部分加入一个布尔变量,如本次循环中没有发生交换,则以后的扫描就可以不进行。

5. 解析:

如果n个点共线,则其最近对只需要考察相邻的点对,因此在对点进行按行坐标排序后,只需要两两计算相邻两点距离,就可以找到最近对。

6. 解析:

所有的过程与寻找二维空间中的最近点对类似,只是计算距离的公式变为:

sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)+(p1.z-p2.z)*(p1.z-p2.z)

使用循环计算任意两个点之间的距离,然后记录最小值即可。

类似的,如果推广到n维空间,需要考虑空间中任意两点的距离计算公式,同样计算每两个点之间的距离,并记录最小距离即可。

7. 解析:

a) 线段的凸包为本身,极点为两个端点。

b) 正方形的凸包为本身,极点为四个顶点。

c) 正方形的边界不是凸包,凸包为正方形(包括边界和内部)。

d) 直线的凸包为本身,没有极点。

8. 解析:

哈密顿回路的穷举查找算法,首选选择起点(图中任意一个点开始),之后不断寻找下一个点,下一个点应该满足:

1) 不在已经走过的点中;

2)与上一个点有直连路径。

如果这样能找到回到起点的路径,并且遍历所有点,则为一条哈密顿回路。然后依次进行下一个可行点的选择。

9. 解析:

生成给定元素的一个排列,通过连续比较它们之间的元素,检查它们是否符合排序的要求。如果符合就停止,否则重新生成新的排列。

最差情况生成排列的个数是!n,每趟连续元素比较次数为n-1次。所以效率类型为

O n n 。

(!*(1))

相关文档
最新文档