算法第二章习题

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

secret(A[0..n-1]) //输入:包含 n 个实数的数组 A minval A[0]; maxval A[0] for i 0 to n-1 do if A[i] < minval minval A[i] if A[j] > maxval maxval A[i] return maxval-minval 对于本算法,试回答下述问题: 1)该算法求的是什么? 2)它的基本操作是什么? 3)该基本操作执行了多少次? 4)该算法的效率类型是什么? 5)对该算法进行改进,若不可能,试证明之。 解:1)数组中最大的元素与最小元素之差 2)比较大小 3)2n 次 算法 4) (n)
所以 ( n 1) ( n ) b. lim
2
10
20
n
10n 2 7 n 3 10n 2 7 n 3 lim 1 n n n2 10n 2 7 n 3 (n) n 显然, 当 n (n 2 lg n) 。 2
2
所以
c. 由于 2n lg( n 2) 2 (n lg n) ,(n 2) 2 lg
=
3n 1 2
3) 9. 试证明,对于一个任意十进制正整数 n,下述算法 BinRec(n)所做的加法运算 的精确次数是 log 2 n : 算法 BinRec(n) //输入:一个正的十进制整数 n
//输出:n 的二进制表示的位数 if n=1 return 1 else return BinRec( n / 2 ) + 1 解:由题知 A(1)=0 当 n=2k 时; A(n) = A(2k) = A(2 k-1)+1 = A(2k-2)+2 · · · · · · k-k =A(2 )+k =A(1)+k 因为 n=2k;所以 k= log 2 n
(i 2 1)
i 0
n 1
b
lg i 2
i2
n
n 1
c
(i 1)2 i 1
i2
3
n
d
(i j )
i 0 j 0
n 1 i 1
解:a. (n3 )
b.
1 ( n )
i 0 j i 1 k i
n 2 n 1
c.
( n 2 n )
第 2 章习题
1. 证明当 a k 0 时,任何多项式 p (n) a k n k a k 1 n k 1 ... a 0 属于集合 (n k ) 解: lim
ak n k ak 1n k 1 ... a0 p (n) lim ak >0 n nk nk
或除法 D(n)作为基本操作 M(n)=D(n) =
5 3k 1 2 2
故该算法的时间效率类型为 (n3 ) 2 ) 由 于 在 最 内 层 循 环 A[j,k] A[j,k] – A[i,k] * A[j,i]/A[i,i] 中 , A[j,i]/A[i,i] 并 不 包 含 最 内 层 循 环 变 量 k 。 所 以 我 们 可 以 使 用 temp= A[j,i]/A[i,i], A[j,k] A[j,k] – A[i,k] * temp 来减少除法的操作次数。 8. 求解下列递归关系 1) 2) 3) x(n)= 3x(n-1),其中 n>1,x(1)=4 x(n)= x(n/3)+ n,其中 n>1,x(1)=1(给出 n=3k 的情况求解) x(n)= 4x(n-1) + x(n-2) - 4,其中 n>=0, x(0)=0, x(1)=1。
n
所以 p (n) a k n k a k 1 n k 1 ... a 0 (n k ) 2. 对于下列每一种函数, 指出它们属于哪一种 ( g (n)) 类型 (尽量使用最简单的 g(n)) ,并给出证明。 a. d.
(n 2 1)10 2n 1 3n 1
k k 1 k
也就是说,当 n=k+1 时,成立,证毕。
12. 考虑基于定义计算第 n 个 Fibonacci 数的递归算法 F(n): 算法 F(n) //根据定义,递归计算第 n 个 Fibonacci 数 //输入:一个非负整数 n //输出:第 n 个 Fibonacci 数 if n <= 1 return n else return F(n-1) + F(n-2)
d. ( n )
3
5. x1 ,..., xn 的采样方差 n 可以这样计算:
i 1
x i
n
x
2
n 1
或者
,其中 x
x
i Βιβλιοθήκη Baidu1
n
i
n
i 1
xi
n
2
n xi i 1 n 1
2
n
根据每个公式,对求方差时需要用到的除法、乘法和加/减运算的次数进行计算 和比较。 解:第一个公式: 除法:2 次, 乘法:n 次, 加/减法:3n-1 次 第二个公式:除法:2 次, 乘法:n+1 次, 加/减法:2n 次 6. 考虑下面的算法
b.解:
1 / i(i i
1
1)
1
1 n n 1 n 1
n 1 n 1
1
c.解:
i 1
i(i 1)
n 1
i 1
i2
i i

(n 1)n(2n 1) n(n 1) (n 1)n(n 1) 6 2 3
4. 计算增长次数(即写出下列和的 ( g (n)) ) a.
5) 可以使用
if A[i] < minval minval A[i] else if A[j] > maxval maxval A[i] 替换 if A[i] < minval minval A[i] if A[j] > maxval maxval A[i] 在输入并非最糟糕的情况下,能在一定程度上提升算法的效率。 7. 已知算法 GE 如下: 算法 GE(A[0..n-1, 0..n]) // 输入: 一个 n 行 n+1 列的实数矩阵 A for i 0 to n-2 do for j i+1 to n-1 do for k i to n do A[j,k] A[j,k] – A[i,k] * A[j,i]/A[i,i] 试问: 1)该算法的时间效率类型 2)该算法有何性能缺陷,试改进之。 1) 解: 将循环最内层的 A[j,k] A[j,k] – A[i,k] * A[j,i]/A[i,i]中的乘法 M (n)
b. e.
10n 2 7n 3
c.
2n lg(n 2)2 (n 2)2 lg
n 2
log 2 n
1 18 2 16 n 20 C20 n C20 n ... 1 (n 2 1)10 解: a. lim lim 1 20 20 n n n n
e. log 2 n log 2 n < log 2 n +1, 又 log 2 n (lg n) , log 2 n +1 (lg n) 所以 log 2 n (lg n) 3. 写出下列表达式的结果:
a.
i 1 j 1

n
n
ij

n
b.
1 / i(i 1)
2
时, n lg n >nlgn,所以 2n lg(n 2) (n 2) lg
2
n (n 2 lg n) 2
时, 3 > 2 ,所
n n
d. 由于 2n 1 (2n ) , 3n 1 (lg n) 。显然,当 n
以2
n 1
3 n 1 (3n )
F (n) 0 1 F n 1 当 n 1 时, 1 1 F ( n ) F ( n 1 )
n
解:用数学归纳法证明:
F (0) F (1) 0 1 当 n=1 时, 成立; F (1) F (2) 1 2 F (k ) 0 1 F (k 1) 设 当 n=k 时, 成立; F (k 1) F (k ) 1 1 F (k 1) F (k ) F (k ) F (k 1) F (k ) 则 当 n=k+1 时, F (k 1) F (k 2) F (k ) F (k 1) F (k 1) F (k ) F (k ) 0 1 0 1 0 1 0 1 F (k 1) * * F (k 1) F (k ) 1 1 1 1 1 1 1 1
i 1
n
c.
i(i 1)
i 1
n 1
a.解:
i 1 j 1
ij
n
n
i 1

n
n(n 1) n(n 1) n n(n 1) n(n 1) n 2(n 1)2 i i 2 2 2 2 4 i 1
1 1 1 1 1 1 1 1 ... 1 ... 1 2 23 n(n 1) 2 2 3 n n 1
解:1)x(n) = 3x(n − 1) = 3[3x(n − 2)] = 32x(n − 2) = 32[3x(n − 3)] = 33x(n − 3) =… = 3ix(n − i) = ... = 3n−1x(1) = 4·3n−1. 2)x(n) = x(n/3) + n for n > 1, x(1) = 1 (solve for n = 2k) x(3k) = x(3k−1) + 3k = [x(3k−2) +3k−1] + 3k = x(3k−2) + 3k−1 +3k = [x(3k−3) + 3k−2] + 3k−1 + 3k = x(3k−3) + 3k−2 +3k−1 +3k = ... = x(3k−i) + 3k−i+1 +3k−i+2 + ... + 3k = ... = x(3k−k) + 31 + 32 + ... + 3k = 1 + 31 + 32 + ... +3k 3n 1 = 2
A(n) = log 2 n
10. 给定算法 Min1(A[first..last])和 Min2(A[first..last]) 算法 1 Min1(A[first..last]) //输入 last>= first 且包含 last-first+1 个实数数组 A if first= last return A[first]; else temp Min1(A[first..last-1]) if temp<= A[last] return temp else return A[last] Min2(A[first..last]) //输入 last>= first 且包含 last-first+1 个实数数组 A if first = last return A[first]; else temp1 Min2(A[first.. first last / 2 ] ) temp2 Min2(A[ first last / 2 +1..last] ) if temp1 <= temp2 else return temp2 return temp1
算法 2
试给出 1)算法 1 和算法 2 所做的基本操作次数的递推关系并求解。 2)算法 1 和算法 2 哪个更快。自已能否提出一个算法,使新算法效率胜过算法 1 和算法 2。 解:1)1. 基本操作 temp<= A[last]; M(n)=M(n-1)+1&M(1)=0 可知 M(n) = n; 2. 基本操作 temp1<=temp2; M(n)=2*M(n/2)+1&M(1)=0 可知 M(n)=n; 2) 一样快,求最小值比较方法就是线性方法。 除此之外,可以考虑位运算。 11. 试证明:
相关文档
最新文档