算法导论课后习题第二章(1)

来源:互联网 发布:mac能玩守望先锋吗 编辑:程序博客网 时间:2024/05/01 11:39

练习

2.1-1:以图 2-2 为模型,说明 INSERTION-SORT 在数组 A=<31,41,59,26,41,58>上的 执行过程。
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
2.1-2:重写过程 INSERTION-SORT,使之按非升序(而丌是按非降序)排序。

INSERTION-SORT(A)
1 for j ← 2 to length[A]
2 do key ←A[j]
3 Insert A[j] into the sorted sequence A[1..j-1]
4 i ←j-1
5 while i > 0 and A[i] < key
6 do A[i+1]←A[i]
7 i ← i − 1
7 A[i+1]←key
2.1-3:考虑下面的查找问题:
输入:一列数 A=(a1 ,a2 ,…,an )和一个值 v
输出:下标 i,使得 v=A[i],或者当 v 不在 A 中出现时为 NIL。

写出针对这个问题的现行查找的伪代码,它顺序地扫描整个序列以查找 v。利用循环不变式证明算法的正确性。确保所给出的循环不变式满足三个必要的性质。
LINEAR-SEARCH(A,v)
1 for i ← 1 to length[A]
2 if v=A[i]

3 return i

4 return NIL

现行查找算法正确性的证明。
初始化: i=1,子数组为 A[1..i],只有一个元素 A[1],如果 v=A[1]就返回 1,否则返回 NIL, 算法显然是正确的。
保持:若算法对数组 A[1..i]正确,则在数组增加一个元素 A[i+1]时,只需要多作一次比较, 因此显然对 A[1..i+1]也正确。
终止:算法如果在非最坏情况下定能返回一个值此时查找成功,如果 n 次查找(遍历了所有

的数)都没有成功,则返回 NIL。算法在有限次查找后肯定能够给出一个返回值,要么说明 查找成功并给出下标,要么说明无此值。因此算法正确。
该算法用 C#实现的代码:

public static int LinearSearch(T[] Input, T v) where T:IComparable
{
for (int i = 0; i < Input.Length;i++ )
if (Input[i].Equals(v))
return i;
return -1;
}
2.1-4:有两个各存放在数组 A 和 B 中的 n 位二迚制整数,考虑它们的相加问题。两个整数

的和以二迚制形式存放在具有(n+1)个元素的数组 C 中。请给出这个问题的形式化描述,并 写出伪代码。
A 存放了一个二进制 n 位整数的各位数值,B 存放了另一个同样是二进制 n 位整数的各位上 的数值,现在通过二进制的加法对这两个数进行计算,结果以二进制形式把各位上的数值存 放在数组 C(n+1 位)中。
BINARY-ADD(A,B,C)
1 flag 0
2 for j 1to n
3 do key←A[ j]+B[j]+flag
4 C[ j]←key mod 2
5 if key>1
6 flag←1
7 if flag=1
8 C[n+1]←1
笔记:

1.RAM(Random-Access Machine)模型分析通常能够很好地预测实际计算机上的性能,

RAM 计算模型中,指令一条接一条地执行,没有并发操作。RAM 模型中包含了真实计算机

中常见的指令:算术指令(加法、剑法、乘法、出发、取余、向下取整、向上取整指令)、 数据移动指令(装入、存储、复制指令)和控制指令(条件和非条件转移、子程序调用和返 回指令)。其中每天指令所需时间都为常量。
RAM 模型中的数据类型有整数类型和浮点实数类型。

2.算法的运行时间是指在特定输入时,所执行的基本操作数(戒步数)。 插入算法的分析比较简单,但是丌是很有用,所以略过。(在解思考题 2-1 时有具体的实例 分析,请参看)
3.一般考察算法的最坏情况运行时间。这样做的理由有三点: A.一个算法的最坏情况运行时间是在仸何输入下运行时间的一个上界。 B.对于某些算法,最坏情况出现的是相当频繁的。 C.大致上来看,“平均情况“通常不最坏情况一样差。
4.如果一个算法的最坏情况运行时间要比另一个算法的低,我们常常就认为它的效率更高。
练习:
2.2-1:用 Θ 形式表示表示函数/1000–100n+3

2.2-2:
考虑对数组 A 中的 n 个数进行排序的问题:首先找出 A 中的最小元素,并将其不是A[1]

中的元素迚行交换。接着,找出 A 中的次最小元素,并将其不 A[2]中的元素进行交换。对 A 中头 n-1 个元素继续这一过程。写出这个算法的伪代码,该算法称为选择排序(selection sort)。对这个算法来说,循环不变式是什么?为什么它仅需要在头 n-1 个元素上运行,而不仅需要在头 n-1 个元素上运行。是因为经过 n-1 次比较后剩下的是最大元素,其理应排在最后一个位置上,因此可以不必对此元素进行交换位置操作是在所有 n 个元素上运行?以

0 0
原创粉丝点击