high←p1-1:
x>A(p2):
low←p2+1:
else:
low←p1+1;high←p2-1
endcase
repeat
j←0
endThriSearch
T(n)=íìg(n)
îT(n/3)+f(n)n足够小
否则
g(n)=O
(1)f(n)=O
(1)
成功:
O
(1),O(log3(n)),O(log3(n))
最坏
最好,平均,
失败:
O(log3(n)),O(log3(n)),O(log3(n))
最好,平均,最坏
4.6对于含有n个内部结点的二元树,证明E=I+2n,其中,E,I分别为外部和内部路径长度。
证明:
数学归纳法
①当n=1时,易知E=2,I=0,所以E=I+2n成立;
②假设n≤k(k>0)时,E=I+2n成立;
③则当n=k+1时,不妨假定找到某个内结点x为叶结点(根据二元扩展树的定义,一定存在这样的结点x,且设该结点的层数为h),将结点x及其左右子结点(外结点)从原树中摘除,生成新二元扩展树。
此时新二元扩展树内部结点为k个,则满足E
k=I
k+2k,考察原树的外部路径长度为E
k+1=E
k-(h-1)+2h,内部路径长度为I
k+1=I
k+(h-1),所以E
k+1=I
k+2k+h+1=I
k+1+2k+2=I
k+1+2(k+1),综合①②③知命题成立。
4.10过程MERGESORT的最坏情况时间是O(nlogn),它的最好情况时间是什么?
能说归并分类的时间是Θ(nlogn)吗?
最好情况:
是对有序文件进行排序。
分析:
在此情况下归并的次数不会发生变化----log(n)次
归并中比较的次数会发生变化(两个长n/2序列归并)
最坏情况
两个序列交错大小,需要比较n-1次
最好情况
一个序列完全大于/小于另一个序列,比较n/2次差异都是线性的,不改变复杂性的阶
因此最好情况也是nlogn,平均复杂度nlogn。
可以说归并分类的时间是Θ(nlogn)
4.11写一个“由底向上”的归并分类算法,从而取消对栈空间的利用。
答:
见《数据结构》
算法MPass(R,n,1ength.X)
MP1[初始化]
i¬
1."
MP2[合并相邻的两个长度为length的子文件]
WHILEi≤n–2*length+1DO
(Merge(R,i,i+length–l,i+2*length–
1."X).i¬i+2*length).
MP3[处理余留的长度小于2*length的子文件]
IFi+length–1THENMerge(R,i,i+length–1,n.X)
ELSEFORj=iTOnDOXj←Rj▌算法MSort(R,n)//直接两路合并排序算法,X是辅助文件,其记录结构与R相同
MS1[初始化]
length¬
1."
MS2[交替合并]
WHILElength(MPass(R,n,length.X).
length¬2*length
iflength>n
thenFORj=1TOnDORj←Xj
elseMPass(X,n,length.R).
length¬2*length)
endif)
4.23通过手算证明(
4."9)和(
4."10)式确实能得到C
11,C
12,C
21和C
22的正确值。
P=(A
11+A
22)(B
11+B
22)T=(A
11+A
12)B
22
Q=(A
21+A
22)B
11U=(A
21-A
11)(B
11+B
12)
R=A
11(B
12-B
22)V=(A
12-A
22)(B
21+B
22)
S=A22(B21-B11)C11=P+S-T+V
=(A
11+A22)(B
11+B
22)+A
22(B
21-B
11)-(A
11+A
12)B
22+(A
12-A
22)(B
21+B
22)=A
11B
11+A
22B
11+A
11B
22+A
22B
22+A
22B
21
-A
22B
11-A
11B
22-A
12B
22+A
12B
21+A
12B
22-A
22B
21-A
22B
22
=A
11B
11+A
12B
21C12=R+T
=A
11B
12-A
11B
22+A
11B
22+A
12B
22
=A
11B
12+A
12B
22C21=Q+S
=A21B11+A22B11+A22B21-A22B11
=A21B11+A22B21C22=P+R-Q+U
=(A
11+A
22)(B
11+B
22)+A
11(B
12+B
22)-(A
21+A
22)B
11+(A
21-A
11)(B
11+B
12)=A
11B
11+A
22B11+A
11B
22+A
22B
22+A
11B
12-A
11B
22-A
21B
11-A
22B
11+A
21B
11+A
21B
12-A
11B
11-A
11B
12
=A
22B
22+A
21B
12
5.2①求以下情况背包问题的最优解,n=7,m=15,=(10,5,15,7,6,18,3)(p
1,.....p
7)
和=(2,3,5,7,1,4,1)。
(w
1,.....w
7)
②将以上数据情况的背包问题记为I。
设FG(I)是物品按p
i的非增次序输入时由GREEDY-KNAPSACK所生成的解,FO(I)是一个最优解。
问FO(I)/FG(I)是多少?
③当物品按w
i的非降次序输入时,重复②的讨论。
解:
①按照p
i/w
i的非增序可得
(p
5/w
5,p
1/w
1,p
6/w
6,p
3/w
3,p
7/w
7,p
2/w
2,p
4/w
4)=(6,5,9/2,3,3,5/3,1)
W的次序为(1,2,4,5,1,3,7),解为(1,1,1,1,1,2/3,0)
所以最优解为:
(1,2/3,1,0,1,1,1)
FO(I)=166/3
②按照Pi的非增次序输入时得到
(p
6,p
3,p
1,p
4,p
5,p
2,p
7)=(18,15,10,7,6,5,3),
对应的(w
6,w
3,w
1,w
4,w
5,w
2,w
7)=(4,5,2,7,1,3,1)
解为(1,1,1,4/7,0,0,0)
所以FG(I)的解为(1,0,1,4/7,0,1,0)
FG(I)=47,所以FO(I)/FG(I)=166/
141."
③按照w
i的非降次序输入时得到
(w
5,w
7,w
1,w
2,w
6,w
3,w
4)=(1,1,2,3,4,5,7)
相应的(p
5,p
7,p
1,p
2,p
6,p
3,p
4)=(6,3,10,5,18,15,7)
解为(1,1,1,1,1,4/5,0)
则FW(I)的解为(1,1,4/5,0,1,1,1)
FW(I)=54,所以FO(I)/FW(I)=83/
81."
5.
3."(0/1背包问题)如果将
5."3节讨论的背包问题修改成n极大化åpx
ii1n
约束条件åw
ix
i£Mxi=0或11≤i≤n1这种背包问题称为0/1背包问题。
它要求物品或者整件装入背包或者整件不装入。
求解此问题的一种贪心策略是:
按p
i/w
i的非增次序考虑这些物品,只要正被考虑的物品能装进的就将其装入背包。
证明这种策略不一定能得到最优解。
证明:
当按照p
i/w
i的非增次序考虑物品存放背包时,如果所装入的物品恰能装满背包时,易证为最优解,否则未必是最优解。
可举例如下:
设n=3,M=6,(p
1,p
2,p
3)=(3,4,8),(w
1,w
2,w
3)=(1,2,5),按照p
i/w
i的非增序得到(p
1/w
1,p
2/w
2,p
3/w
3)=(3,2,
1."6),则其解为(1,1,0),而事实上最优解是(1,0,1),问题得证。
5.
6."假定要将长为l
1,l
2,„,l
n的n个程序存入一盘磁带,程序i被检索的频率是f
i。
如果程序按i
1,i
2,„,i
n的次序存放,则期望检索时间(ERT)是njnik
[å(fij
j=1ål
k=1)]/åfii=1
①证明按l
i的非降次序存放程序不一定得到最小的ERT。
②证明按f
i的非增次序存放程序不一定得到最小的ERT。
③证明按f
i/l
i的非增次序来存放程序时ERT取最小值。
证明:
只需证明结论③是正确的即可,现证明如下:
假设l
i,li12,„,linnn按照f
i/l
i的非增次序存放,即fi1/l
i≥f
i/l
i≥„≥f
i/l
i,则得到
122nERT=[f
il
i+f
i(l
i+l
i)+„+f
i(l
i+l
i+„+l
i]/åfi112n12n
i=1
假设该问题的一个最优解是按照j
1,j
2,„,j
n的顺序存放,并且其期望检索式件是ERT¢,我们只需证明ERT≤ERT¢,即可证明按照f
i/l
i的非增次序存放得到的是最优解。
易知nERT¢=[fj1lj1+fj2(l
j+l
j)+„+f
j(l
j+l
j+„+l
j)]/åfi12n
i=1
从前向后考察最优解中的程序,不妨设程序j
k是第一个与其相邻的程序j
k+1存在关系f
j/l
j≤f
j/l
j,则交换程序j
k和程序j
k+1,得到的期望检索时间kkk+1k+1
记为
ERT¢¢
ERT¢¢-
ERT¢=fjkljk+1-fjk+1ljk≤0
ERT¢¢≤
ERT¢
显然
ERT¢¢也是最优解,将原来的最优解中所有这样类似于反序对的程序互换位置,得到的解不比原来的最优解差,所以最终变换后得到的解也是最优解,而最终的解恰是程序按f
i/l
i的非增次序来存放得到的顺序。
命题得证。
5.
7."假定要把长为l
1,l
2,„,l
n的n个程序分布到两盘磁带T
1和T
2上,并且希望按照使最大检索时间取最小值的方式存放,即,如果存放在T
1和T
2上的程序集合分别是A和B,那么就希望所选择的A和B使得max{å
iÎAl
i,å
iÎBl
i}取最小值。
一种得到A和B的贪心方法如下:
开始将A和B都初始化为空,然后一次考虑一个程序,如果å
iÎAl
i=min{å
iÎAl
i,å
iÎBl
i},则将当前正在考虑的那个程序分配给A,否则分配给B。
证明无论是按l
1≤l
2≤„≤l
n或是按l
1≥l
2≥„≥l
n的次序来考虑程序,这种方法都不能产生最优解。
证明:
按照l
1≤l
2≤„≤l
n存放不会得到最优解,举例如下:
3个程序(a,b,c)长度分别为(1,2,3),根据题中的贪心算法,产生的解是A={a,c}B={b},则max{å
iÎAl
i,å
iÎBl
i}=4,而事实上,最优解应为3,所以得证.
按照l
1≥l
2≥„≥l
n的次序存放也不会得到最优解,举例如下:
5个程序(a,b,c,d,e)长度分别为(10,9,8,6,4)根据题中的贪心算法,产生的解是A={a,d,e}B={b,c},则max{å
iÎAl
i,å
iÎBl
i}=20,而事实上,最优解应为19,所以得证。
(p
1,.....p
7)(d
1,.....d
7)
5.
8."①当n=7,=(3,5,20,18,1,6,30)和=(1,3,4,3,2,1,2)时,算法
5."5所生成的解是什么?
②证明即使作业有不同的处理时间定理
5."3亦真。
这里,假定作业I的效益p
i>0,要用的处理时间t
i>0,限期d
i≥t
i.
非增排序得到解:
①根据p
i的
(p
7,p
3,p
4,p
6,p
2,p
1,p
5)=(30,20,18,6,5,3,1),对应的期限为(2,4,3,1,3,1,2),按照算法
5."4生成的解为:
a.J
(1)=7
b.J
(1)=7,J
(2)=3
c.J
(1)=7,J
(2)=4,J
(3)=3
d.J
(1)=6,J
(2)=7,J
(3)=4,J
(4)=3;
②证明:
显然即使t
i>0(d
i≥t
i),如果J中的作业可以按照s的次序而又不
k违反任何一个期限来处理,即对s次序中的任一个作业k,应满足d
k≥åt
j,j=1则J就是一个可行解。
下面证明如果J是可行解,则使得J中的作业可以按照d
i,d
i,„,d
i排列12n的序列s处理而又不违反任何一个期限。
k因为J是可行解,则必存在s¢=r
1r
2„r
n,使得对任意的r
k,都有d
k≥åt
j,j=1我们设s是按照d
i≤d
i≤,„,≤d
i排列的作业序列。
假设s¢¹s,那么令a是使12nra¹i
a的最小下标,设r
b=i
a,显然b>a,在s¢中将r
a与r
b相交换,因为d
r≤d
r,ba显然r
a和r
b可以按期完成作业。
还要证明r
a和r
b之间的作业也能按期完成。
因为d
r≤d
r,而显然二者之间bab的所有作业r
t,都有d
r>d
r,又由于s是可行解,所以åt
k≤d
r≤d
r。
所以作tbbt
k=1
业r
a和r
b交换后,所有作业可依新产生的排列s¢¢==s
1s
2„s
n的次序处理而不违反任何一个期限,连续使用这种方法,s¢就可转换成s且不违反任何一个期限,定理得证。
5.10①已知n-1个元素已按min-堆的结构形式存放在A
(1),„,A(n-1)。
现要将另一存放在A(n)的元素和A(1:
n-1)中元素一起构成一个具有n个元素的min-堆。
对此写一个计算时间为O(logn)的算法。
②在A(1:
n)中存放着一个min-堆,写一个从堆顶A
(1)删去最小元素后将其余元素调整成min-堆的算法,要求这新的堆存放在A(1:
n-1)中,且算法时间为O(logn).
③利用②所写出的算法,写一个对n个元素按非增次序分类的堆分类算法。
分析这个算法的计算复杂度。
解:
①procedureINSERT(A,n)
integeri,j,k
j←n;i←
ën/2û
whilei≥1andA[i]>A[j]do
k←A[j];
A[j]←A[i];
A[i]←k
j←i;
i←
ëi/2û
repeat
endINSERT
②procedureRESTORE(A,l,n)
integeri,j,k
x←A[n];
A[n]←A[l]
i←1
j←2*i
whilej≤n-1do
if(jA[j+1])
thenj←j+1
endif
if(x>A[j])
thenA[i]←A[j];i←j;j←2*i
elsei←n
endif
repeat
endRESTORE
③procedureHEAPSORT(A,n)
integeri,k
fori=
ën/2ûto1step–1do
RESTORE(A,i,n)
repeat
fori=nto2step–1do
k←A[1];A[1]←A[i];A[i]←k
RESTORE(A,1,i-1)
repeat
endHEAPSORT
5.
11."①证明如果一棵树的所有内部节点的度都为k,则外部节点数n满足nmod(k-1)=
1."
②证明对于满足nmod(k-1)=1的正整数n,存在一棵具有n个外部节点的k元树T(在一棵k元树中,每个节点的度至多为k)。
进而证明T中所有内部节点的度为k.
证明:
①设某棵树内部节点的个数是m,外部结点的个数是n,边的条数是e,则有
e=m+n-1和e=mk
mk=m+n-1Þ(k-1)m=n-1Þnmod(k-1)=1
②利用数学归纳法。
当n=1时,存在外部结点数目为1的k元树T,并且T中内部结点的度为k;
假设当n≤m,且满足nmod(k-1)=1时,存在一棵具有n个外部结点的k元树T,且所有内部结点的度为k;
我们将外部结点数为n(n为满足n≤m,且nmod(k-1)=1的最大值)的符合上述性质的树T中某个外部结点用内部结点a替代,且结点a生出k个外部结点,易知新生成的树T’中外部结点的数目为n+(k-1),显然n为满足nmod(k-1)=1,且比m大的最小整数,而树T’每个内结点的度为k,即存在符合性质的树。
综合上述结果可知,命题成立。
5.
12."①证明如果nmod(k-1)=1,则在定理
5."4后面所描述的贪心规则对于所有的(q
1,q
2,„,q
n)生成一棵最优的k元归并树。
②当(q
1,q
2,„,q
11)=(3,7,8,9,15,16,18,20,23,25,28)时,画出使用这一规则所得到的最优3元归并树。
解:
①通过数学归纳法证明:
对于n=1,返回一棵没有内部结点的树且这棵树显然是最优的。
假定该算法对于(q
1,q
2,„,q
m),其中m=(k-1)s+1(0≤s),都生成一棵最优树.
则只需证明对于(q
1,q
2,„,q
n),其中n=(k-1)(s+1)+1,也能生成最优树即可。
不失一般性,假定q
1≤q
2≤„≤q
n,且q
1,q
2,„,q
k是算法所找到的k棵树的WEIGHT信息段的值。
于是q
1,q
2,„,q
k棵生成子树
T,设
T¢是一棵对于(q
1,q
2,„,q
n)的最优k元归并树。
设P是距离根最远的一个内部结点。
如果P的k个儿子不是q
1,q
2,„,q
k,则可以用q
1,q
2,„,q
k和P现在的儿子进行交换,这样不增加T¢的带权外部路径长度。
因此T也是一棵最优归并树中的子树。
于是在T¢中如果用其权为q1+q2+„+qk的一个外部结点来代换T,则所生成的树T¢¢是关于(q
1+q
2+„+q
k,q
k+1,„,q
n)的一棵最优归并树。
由归纳假设,在使用其权为q
1+q
2+„+q
k的那个外部结点代换了T以后,过程TREE转化成去求取一棵关于(q
1+q
2+„+q
k,q
k+1,„,q
n)的最优归并树。
因此TREE生成一棵关于(q
1,q
2,„,q
n)的最优归并树。
6."
2.修改过程ALL_PATHS,使其输出每对结点(i,j)间的最短路径,这个新算法的时间和空间复杂度是多少?
ProcedureShortestPath(COST,n,A,Max)
integeri,j,k
realCOST(n,n),A(n,n),Path(n,n),Max
fori←1tondo
forj←1tondo
A(i,j)←COST(i,j)
ifi≠jandA(i,j)≠MaxthenPath(i,j)←j
elsePath(i,j)←0
endif
repeat
repeat
fork←1tondo
fori←1tondo
forj←1tondo
ifA(i,j)>A(i,k)+A(k,j)
thenA(i,j)←A(i,k)+A(k,j)
Path(i,j)←Path(i,k)
endif
repeat
repeat
repeat
fori←1tondo
forj←1tondo
print(“thepathofitojis”i)
k←path(i,j)
whilek≠0do
print(,k)
k←path(k,j)
repeat
repeat
repeat
endShortestPath
时间复杂度O(n3),空间复杂度O(n2)
6.
4."①证明算法OBST的计算时间是O(n2)。
②在已知根R(i,j),0≤i