算法导论第二版答案
Chapter2 Getting Start
2.1 Insertion sort
2.1.2 将Insertion-Sort重写为按非递减顺序排序
2.1.3 计算两个n位的二进制数组之和
2.2 Analyzing algorithms
2.2.1将函数n3/1000100n2100n3用符号表示
2.2.2写出选择排序算法selection-sort
当前n-1个元素排好序后,第n个元素已经是最大的元素了. 最好时间和最坏时间均为(n2)
2.3 Designing algorithms
2ifn2T(n)k2T(n/2)nifn2,fork1 2.3.3 计算递归方程的解
(1) 当k1时,n2,显然有T(n)nlgn
(2) 假设当ki时公式成立,即T(n)nlgn2ilg2ii2i,
则当ki1,即n2i1时,
T(n)T(2i1)2T(2i)2i1i2i12i1(i1)2i2i1lg(2i1)nlgn T(n)nlgn
2.3.4 给出insertion sort的递归版本的递归式
(1)ifn1 T(n)T(n1)(n)ifn1
2.3-6 使用二分查找来替代insertion-sort中while循环内的线性扫描,是否可以将算法的时间提高到(nlgn)?
虽然用二分查找法可以将查找正确位置的时间复杂度降下来,但是移位操作的复杂度并没有减少,所以最坏情况下该算法的时间复杂度依然是(n2)
2.3-7 给出一个算法,使得其能在(nlgn)的时间内找出在一个n元素的整数数组内,是否存在两个元素之和为x
首先利用快速排序将数组排序,时间(nlgn),然后再进行查找: Search(A,n,x)
QuickSort(A,n);
i←1; j←n;
while A[i]+A[j]x and i
if A[i]+A[j]
i←i+1
else
j←j-1
if A[i]+A[j]=x
return true
else
return false
时间复杂度为(n)。
或者也可以先固定一个元素然后去二分查找x减去元素的差,复杂度为(nlgn)。 Chapter3 Growth of functions
3.1Asymptotic notation
3.1.2证明对于b0,(na)b(nb)
a0时,(na)b(nn)b2bnb
(na)n
bbbbbb对于c11,c22,c1n(na)c2n
a0时,(na)bnb
存在n02a,当nn0时,(na)(n/2)
bbbbbb对于c12,c21,c1n(na)c2n
3.1-4 判断2n1与22n是否等于O(2n)
3.1.6 证明如果算法的运行时间为(g(n)),如果其最坏运行时间为O(g(n)),最佳运行时间为(g(n))。
最坏时间O(g(n)),即Tc2g(n);
最佳时间(g(n)),即Tc1g(n)
T(g(n))
3.1.7:证明o(g(n))(g(n))
定义
3.2 Standard notation and common functions
3.2.2 证明alogccloga bb
lgalogbclogbclga
lgclogbalgalgclgb lgalgclogbalgclgb
alogbcclogba
nnn!(2)andn!o(n) lg(n!)(nlgn)证明 3.2.3
lgn!lgilgnnlgn
i1i1nn
lgi[lgilg(ni)]lg[i(ni)]lg(
i1i1i1i1nn/2n/2n/2n1)nlgnnnlgn422
lg(n!)(nlgn)
当n>4时,i(ni)2,n!i(ni)2n,n!(2n) 2
i1n/2
n!nn,n!o(nn)
3.2.4是否多项式有界 lglgn!lgn!与
设lgn=m,
则m!)me2m()mem(lnm1)mlnm1nlnlnn ∴lgn!不是多项式有界的。 meme
mmmm2设lglgnm,m!m(2)222m1
lglgnm1,n22
lglgn!22m1m1 n lglgn是多项式有界的
3.2.5比较lg(lg*n)与lg*(lgn)
lg*(lgn)= lg*n-1
设lg*n=x,lgx
lg*(lgn)较大。
Chapter4 Recurrences
4.1 The recursion-tree
4.1.1 证明T(n)T()1的解为O(lgn)
假设T()clg(b)clg(n/2b1) n-2b+2则T(n)clg(-b+1)+1=clg()+1=clg(n-2b+2)-clg2+1clg(n-b)2
T(n)O(lgn)
4.1.2 证明T(n)2T(n)n的解为O(nlgn)
设T(n)cnlgn
T(n)2cnlgnnclgnnn
c(n1)lg(n/2)ncnlgnclgncnncn(lgn1)nc(lgn2n)
lgn1lg(n1),当c1/3,nc(lgn2n)
T(n)cnlg(n1),T(n)(nlgn)
T(n)O(nlgn)
4.1.3
将假设改为T(n) = cn lgn +b,只需要在T(1)=1的情况下成立。
4.1.6
计算T(n)2T1的解
令mlgn,T(2m)2T(2m/2)1
令T(n)=S(m),则S(m)2S(m/2)1
其解为S(m)(m),T(n)S(m)(lgn)
4.2 The recursion-tree method
4.2.1 T(n)(nlg3)
4.2.2 略
4.2.3 T(n)(n2)
4.2.5 T(n)(nlgn)
4.3 The master method
4.3.1 略
4.3.4 主方法是否适用方程T(n)4T(n/2)n2lgn,给出该方程解的一个上界
不适用
使用递归树方法可以求得其一个上界为O(n2lg2n)
4.3.5给出某常数a1,b1和函数f(n),使得其满足主定理case3中除了af(n/b)cf(n)外的所有条件。
f(n)n(sinn2),a1,b2,logba=0
sinn21,f(n)n,f(n)(nlogba)=(n),0
af(n/b)f(n/2)n(sin(n/2)2)/2
若af(n/b)cf(n)
则n(sin(n/2)2)/2cn(sinn2)
sin(n/2)2c2(sinn2)
找不到这样的c1,总是满足上面的条件,如sinn
1时,sin(n/2)为/2,此时sin(n/2)21,所以af(n/b)cf(n)不满足。 2(sinn2)
算法导论第二版答案
Chapter2 Getting Start
2.1 Insertion sort
2.1.2 将Insertion-Sort重写为按非递减顺序排序
2.1.3 计算两个n位的二进制数组之和
2.2 Analyzing algorithms
2.2.1将函数n3/1000100n2100n3用符号表示
2.2.2写出选择排序算法selection-sort
当前n-1个元素排好序后,第n个元素已经是最大的元素了. 最好时间和最坏时间均为(n2)
2.3 Designing algorithms
2ifn2T(n)k2T(n/2)nifn2,fork1 2.3.3 计算递归方程的解
(1) 当k1时,n2,显然有T(n)nlgn
(2) 假设当ki时公式成立,即T(n)nlgn2ilg2ii2i,
则当ki1,即n2i1时,
T(n)T(2i1)2T(2i)2i1i2i12i1(i1)2i2i1lg(2i1)nlgn T(n)nlgn
2.3.4 给出insertion sort的递归版本的递归式
(1)ifn1 T(n)T(n1)(n)ifn1
2.3-6 使用二分查找来替代insertion-sort中while循环内的线性扫描,是否可以将算法的时间提高到(nlgn)?
虽然用二分查找法可以将查找正确位置的时间复杂度降下来,但是移位操作的复杂度并没有减少,所以最坏情况下该算法的时间复杂度依然是(n2)
2.3-7 给出一个算法,使得其能在(nlgn)的时间内找出在一个n元素的整数数组内,是否存在两个元素之和为x
首先利用快速排序将数组排序,时间(nlgn),然后再进行查找: Search(A,n,x)
QuickSort(A,n);
i←1; j←n;
while A[i]+A[j]x and i
if A[i]+A[j]
i←i+1
else
j←j-1
if A[i]+A[j]=x
return true
else
return false
时间复杂度为(n)。
或者也可以先固定一个元素然后去二分查找x减去元素的差,复杂度为(nlgn)。 Chapter3 Growth of functions
3.1Asymptotic notation
3.1.2证明对于b0,(na)b(nb)
a0时,(na)b(nn)b2bnb
(na)n
bbbbbb对于c11,c22,c1n(na)c2n
a0时,(na)bnb
存在n02a,当nn0时,(na)(n/2)
bbbbbb对于c12,c21,c1n(na)c2n
3.1-4 判断2n1与22n是否等于O(2n)
3.1.6 证明如果算法的运行时间为(g(n)),如果其最坏运行时间为O(g(n)),最佳运行时间为(g(n))。
最坏时间O(g(n)),即Tc2g(n);
最佳时间(g(n)),即Tc1g(n)
T(g(n))
3.1.7:证明o(g(n))(g(n))
定义
3.2 Standard notation and common functions
3.2.2 证明alogccloga bb
lgalogbclogbclga
lgclogbalgalgclgb lgalgclogbalgclgb
alogbcclogba
nnn!(2)andn!o(n) lg(n!)(nlgn)证明 3.2.3
lgn!lgilgnnlgn
i1i1nn
lgi[lgilg(ni)]lg[i(ni)]lg(
i1i1i1i1nn/2n/2n/2n1)nlgnnnlgn422
lg(n!)(nlgn)
当n>4时,i(ni)2,n!i(ni)2n,n!(2n) 2
i1n/2
n!nn,n!o(nn)
3.2.4是否多项式有界 lglgn!lgn!与
设lgn=m,
则m!)me2m()mem(lnm1)mlnm1nlnlnn ∴lgn!不是多项式有界的。 meme
mmmm2设lglgnm,m!m(2)222m1
lglgnm1,n22
lglgn!22m1m1 n lglgn是多项式有界的
3.2.5比较lg(lg*n)与lg*(lgn)
lg*(lgn)= lg*n-1
设lg*n=x,lgx
lg*(lgn)较大。
Chapter4 Recurrences
4.1 The recursion-tree
4.1.1 证明T(n)T()1的解为O(lgn)
假设T()clg(b)clg(n/2b1) n-2b+2则T(n)clg(-b+1)+1=clg()+1=clg(n-2b+2)-clg2+1clg(n-b)2
T(n)O(lgn)
4.1.2 证明T(n)2T(n)n的解为O(nlgn)
设T(n)cnlgn
T(n)2cnlgnnclgnnn
c(n1)lg(n/2)ncnlgnclgncnncn(lgn1)nc(lgn2n)
lgn1lg(n1),当c1/3,nc(lgn2n)
T(n)cnlg(n1),T(n)(nlgn)
T(n)O(nlgn)
4.1.3
将假设改为T(n) = cn lgn +b,只需要在T(1)=1的情况下成立。
4.1.6
计算T(n)2T1的解
令mlgn,T(2m)2T(2m/2)1
令T(n)=S(m),则S(m)2S(m/2)1
其解为S(m)(m),T(n)S(m)(lgn)
4.2 The recursion-tree method
4.2.1 T(n)(nlg3)
4.2.2 略
4.2.3 T(n)(n2)
4.2.5 T(n)(nlgn)
4.3 The master method
4.3.1 略
4.3.4 主方法是否适用方程T(n)4T(n/2)n2lgn,给出该方程解的一个上界
不适用
使用递归树方法可以求得其一个上界为O(n2lg2n)
4.3.5给出某常数a1,b1和函数f(n),使得其满足主定理case3中除了af(n/b)cf(n)外的所有条件。
f(n)n(sinn2),a1,b2,logba=0
sinn21,f(n)n,f(n)(nlogba)=(n),0
af(n/b)f(n/2)n(sin(n/2)2)/2
若af(n/b)cf(n)
则n(sin(n/2)2)/2cn(sinn2)
sin(n/2)2c2(sinn2)
找不到这样的c1,总是满足上面的条件,如sinn
1时,sin(n/2)为/2,此时sin(n/2)21,所以af(n/b)cf(n)不满足。 2(sinn2)