导航

算法导论第三版第二章第一节习题答案

Posted on 2013-03-01 17:29  蝈蝈俊  阅读(1171)  评论(0编辑  收藏  举报

2.1-1:以图2-2为模型,说明INSERTION-SORT在数组A=<31,41,59,26,41,58>上的执行过程。

NewImage

 

2.1-2:重写过程INSERTION-SORT,使之按非升序(而不是按非降序)排序。

注意,跟之前升序的写法只有一个地方不一样:

NewImage

 

2.1-3:考虑下面的查找问题:

输入:一列数A=<a1,a2,…,an >和一个值v
输出:下标i,使得v=A[i],或者当v不在A中出现时为NIL。
写出针对这个问题的现行查找的伪代码,它顺序地扫描整个序列以查找v。
利用循环不变式证明算法的正确性。确保所给出的循环不变式满足三个必要的性质。

(2.1-3 Consider the searching problem:
Input: A sequence of n numbers A D ha1; a2; : : : ;ani and a value _.
Output: An index i such that _ D AOEi_ or the special value NIL if _ does not appear in A.
Write pseudocode for linear search, which scans through the sequence, looking for _. Using a loop invariant, prove that your algorithm is correct. Make sure that your loop invariant fulfills the three necessary properties.)

LINEAR-SEARCH(A,v)

1 for i=1 to A.length
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。算法在有限次查找后肯定能够给出一个返回值,要么说明查找成功并给出下标,要么说明无此值。因此算法正确。

 

2.1-4:有两个各存放在数组A和B中的n位二进制整数,考虑它们的相加问题。两个整数的和以二进制形式存放在具有(n+1)个元素的数组C中。请给出这个问题的形式化描述,并写出伪代码。

(Consider the problem of adding two n-bit binary integers, stored in two n-element arrays A and B. The sum of the two integers should be stored in binary form in an (n+1)-element array C. State the problem formally and write pseudocode for adding the two integers.)

A存放了一个二进制n位整数的各位数值,B存放了另一个同样是二进制n位整数的各位上的数值,现在通过二进制的加法对这两个数进行计算,结果以二进制形式把各位上的数值存放在数组C(n+1位)中。注意这里的增加需要考虑进位的问题。

该问题主要是判断一下进位。A[i] + B[i] + C[i], 其中C[i]为进位标志。
/**整数和代码,其中n为A和B的二进制位数*/
for(i = 0; i < n; i++) {
        if (A[i] + B[i] +C[i] == 0) {
              C[i] = 0;
       } else if(A[i] + B[i] + C[i] == 1) {
              C[i] = 1;
       } else if(A[i] + B[i] + C[i] == 2) {
              C[i] = 0;
              C[i + 1] = 1;
       } else if(A[i] + B[i] + C[i] == 3) {
              C[i] = 1;
              C[i + 1] = 1;
       }
}

 

一个更简单明了的伪代码:

BINARY-ADD(A,B,C)

 flag = 0 // 需要进位标志
 for j=1 to n
         key=A[j]+B[j]+flag
         C[j] = key mod 2
         flag = key / 2 // 获得进位

 

参考资料:

http://www.cnblogs.com/sinoxavier/archive/2012/11/23/2785077.html

http://qiemengdao.iteye.com/blog/1328678

http://www.cnblogs.com/timebug/archive/2010/03/09/1682020.html

http://blog.csdn.net/puweilan/article/details/6613396

https://github.com/Airead/excise/blob/master/algorithms/algorithms.org

https://docs.google.com/viewer?a=v&q=cache:hu0UWB6qpUgJ:fongfc.files.wordpress.com/2009/10/alg_sol_ch_2.pdf+&hl=zh-CN&gl=cn&pid=bl&srcid=ADGEESj5S_EjsSP4YCrBqM-wg51OMZCD2cE7hUDgpMMxgrR53J8ShQeMWMnDWzPzwFCTmeGDsa4mQCn8QPDNCcT89mXjSGUPz8D4fLIqX7SRvIETC-bqWeuoe9yUog8kpthCYtuyDtY7&sig=AHIEtbSj8XPsoBey-u5H0l1KHNNX_U9vNw