算法导论2.1 Exercises 答案

2.1-1

$\begin{aligned}
&[],[31,41,59,26,41,58]\
&[\underline{31}],[41,59,26,41,58]\
&[31,\underline{41}],[59,26,41,58]\
&[31,41,\underline{59}],[26,41,58]\
&[\underline{26},31,41,59],[41,58]\
&[26,31,41,\underline{41},59],[58]\
&[26,31,41,41,\underline{58},59],[]
\end{aligned}$

2.1-2

初始化:一开始时求了前$0$个元素的和,也就是说不包含任何数。

保持:在迭代到第$i$个元素时,$sum$是数组$A[1:i-1]$的元素之和。添加上$A[i]$后,$sum$就成为了数组$A[1:i]$的元素之和。

终止:最终,通过下标$i$迭代了每一个元素,只要超过了长度$n$,循环终止。因此整个算法是正确的。此时就有$sum=A[1:n]$。

2.1-3

1
2
3
4
5
6
7
8
INSERTION-SORT(A, n)
for i = 2 to n
key = A[i]
j = i – 1
while j > 0 and A[j] < key
A[j + 1] = A[j]
j = j – 1
A[j + 1] = key

这时候在插入的元素的位置,右边全是比它小的,左边全是比它大的。

2.1-4

1
2
3
4
5
LINEAR-SEARCH(A, n, x)
for i = 1 to n
if A[i] == x
return i
return NIL

循环不变量:$A[1:i-1]$中都不包含数$x$。

初始化:迭代开始前处理的是空数组,并没有发现和$x$的元素。

保持:在数组$A[1:i-1]$没有发现$x$的基础上,判断$A[i]$是否和$x$相等。如果相等,那么及时返回下标$i$,循环不变量$A[1:i-1]$依旧不包含$x$;否则说明数组$A[1:i]$也没有发现$x$。

终止:如果找到了一个$i$使得$A[i]=x$,那么算法立刻返回当前下标,算法提前结束。当直到循环结束时,下标$i$的值已经为$n+1$,这说明数组$A[1,n]$并没有发现$x$,故返回NIL,算法正确结束。

2.1-5

1
2
3
4
5
6
7
8
9
10
ADD-BINARY-INTEGERS(A, B, n)
let C[0 : n] be new arrays
carry = 0
for i = 0 to n - 1
sum = carry + A[i] + B[i]
C[i] = sum % 2
carry = floor(sum / 2)
C[n] = carry
return C