(MPass(R,n,length.X).
length?
2*length
iflength>nthenFORj=1TOelseMPass
lengthendif)
4.23通过手算证明(4.9)P=(A11+A22)(B11+B22)
Q=(A21+A22)B11
R=A11(B12-B22)
S=A22(B21-B11)
C11=P+S-T+V
=(A11+A22)(B11+B22)+A22(B21-B11)-(A11+A12)B22+(A12-A22)(B21+B22)=A11B11+A22B11+A11B22+A22B22+A22B21
-A22B11-A11B22-A12B22+A12B21+A12B22-A22B21-A22B22
=A11B11+A12B21
C12=R+T
=A11B12-A11B22+A11B22+A12B22
=A11B12+A12B22
C21=Q+S
=A21B11+A22B11+A22B21-A22B11
=A21B11+A22B21
C22=P+R-Q+U
=(A11+A22)(B11+B22)+A11(B12+B22)-(A21+A22)B11+(A21-A11)(B11+B12)=A11B11+A22B11+A11B22+A22B22+A11B12-A11B22-A21B11-A22B11+A21B11+A21B12-A11B11-A11B12
=A22B22+A21B12
5.2①求以下情况背包问题的最优解,n=7,m=15,(p1,p7)=(10,5,15,7,6,18,3)和(w1,w7)=(2,3,5,7,1,4,1)。
②将以上数据情况的背包问题记为I。
设FG(I)是物品按pi的非增次序输入时由GREEDY-KNAPSA所生成的解,FO(I)是一个最优解。
问FO(I)/FG(I)是多少?
3当物品按Wi的非降次序输入时,重复②的讨论。
解:
①按照pfWi的非增序可得
(p5/w5,p1/w1,p6/w6,p3/w3,p7/w7,p2/w2,p4/w4)
=(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
2按照Pi的非增次序输入时得到
(p6,p3,p1,p4,p5,p2,p7)=(18,15,10,7,6,5,3),
对应的(W6,W3,Wi,W4,W5,W2,W7)=(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.
3按照Wi的非降次序输入时得到
(W5,W7,W1,W2,W6,W3,W4)=(1,1,2,3,4,5,7)
相应的(p5,p7,p1,p2,p6,p3,p4)=(6,3,10,5,18,15,7)
解为(1,1,1,1,1,4/5,0)贝UFW(I)的解为(1,1,4/5,0,1,1,1)
FW(I)=54,所以FO(I)/FW(l)=83/81.
5.3.(0/1背包问题)如果将5.3节讨论的背包问题修改成
pixi
极大化
1
n
约束条件wxiMxi=0或11
1
这种背包问题称为0/1背包问题。
它要求物品或者整件装入背包或者整件不装入。
求解此问题的一种贪心策略是:
按p』Wi的非增次序考虑这些物品,只要正被考虑的物品能装进的就将其装入背包。
证明这种策略不一定能得到最优解。
证明:
当按照Pi/wi的非增次序考虑物品存放背包时,如果所装入的物品恰能装满背包时,易证为最优解,否则未必是最优解。
可举例如下:
设n=3,M=6,(p1,p2,p3)=(3,4,8),(w1,w2,w3)
=(1,2,5),按照Pi/Wi的非增序得到(Pi/WjP2/W2,P3/W3)=(3,2,1.6),则其解为(1,1,0),而事实上最优解是(1,0,1),问题得证。
5.6•假定要将长为h,I?
…,In的n个程序存入一盘磁带,程序i被检索的频
率是fi。
如果程序按ii,i2,…,in的次序存放,则期望检索时间(ERT是
njn
[(fijIik)]/fi
j1k1i1
1证明按li的非降次序存放程序不一定得到最小的ERT
2证明按fi的非增次序存放程序不一定得到最小的ERT。
3证明按fi/li的非增次序来存放程序时ERT取最小值。
证明:
只需证明结论③是正确的即可,现证明如下:
假设li1,li2,…,lin按照fi/li的非增次序存放,即
fi1/li1>fi2/li2>->fin/lin,则得到
n
ERT=[fi1li1+fi2(li1+li2)+^+fin(li1+li2+^+hn"£
i1
假设该问题的一个最优解是按照j1,j2,…,jn的顺序存放,并且其期望检
索式件是ERT,我们只需证明ERT放得到的是最优解。
易知
n
ERT=[fjilji+fj2(ljl+lj2)+…+fjn(ljl+L+…+ljn)]/
i1
从前向后考察最优解中的程序,不妨设程序jk是第一个与其相邻的程序jk1存在关系fjk/ljkERT-ERT=fjkljki-fjkiljk<0
ERT显然ERT也是最优解,将原来的最优解中所有这样类似于反序对的程序互换位置,得到的解不比原来的最优解差,所以最终变换后得到的解也是最优解,而最终的解恰是程序按fi/li的非增次序来存放得到的顺序。
命题得证。
5.7.假定要把长为li,12,…,In的n个程序分布到两盘磁带Ti和T2上,并且希望
按照使最大检索时间取最小值的方式存放,即,如果存放在T1和T2上的程序集合分别是A和B,那么就希望所选择的A和B使得max{iAli,i}取最小值。
一种得到A和B的贪心方法如下:
开始将A和B都初始化为空,然后一次考虑一个程序,如果iAli=min{iAli,iBli},则将当前正在考虑的那个程序分配给A,否则分配给B。
证明无论是按hI2>->In的次序
来考虑程序,这种方法都不能产生最优解。
证明:
按照h3个程序(a,b,c)长度分别为(i,2,3),根据题中的贪心算法,产生的解是A={a,c}B={b},则max{iAIi,iBIi}=4,而事实上,最优解应为3,所以得证.
按照l1>l2>->ln的次序存放也不会得到最优解,举例如下:
5个程序(a,b,c,d,e)长度分别为(i0,9,8,6,4)根据题中的贪心算法,产生的解是A={a,d,e}B={b,c},则max{iAli,iBli}=20,而事实上,最优解应为19,所以得证。
5.8.①当n=7,(p1,.•…p7)=(3,5,20,18,1,6,30)和(••…d»=(1,3,4,3,2,1,2)
时,算法5.5所生成的解是什么?
②证明即使作业有不同的处理时间定理5.3亦真。
这里,假定作业I的效益
Pi>0,要用的处理时间ti>0,限期di>ti.
解:
①根据Pi的非增排序得到(P7,P3,P4,P6,P2,P1,P5)=(30,20,18,6,531),对应的期限为
(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;
②证明:
显然即使ti>0(di>ti),如果J中的作业可以按照的次序而又
k
不违反任何一个期限来处理,即对次序中的任一个作业k,应满足dk>tj,
j1则J就是一个可行解。
下面证明如果J是可行解,贝U使得J中的作业可以按照dh,di2,…,din排列的序列处理而又不违反任何一个期限。
k
因为J是可行解,则必存在=口「2…rn,使得对任意的rk,都有dk>tj,
j1我们设是按照dh假设,那么令a
是使raia的最小下标,设rb=ia,显然b>a,在中将ra与山相交换,因为
drb还要证明ra和rb之间的作业也能按期完成。
因为drbb
的所有作业rt,都有drt>drb,又由于是可行解,所以tk所以作
k1
业ra和rb交换后,所有作业可依新产生的排列==®s2…sn的次序处理而不违
反任何一个期限,连续使用这种方法,就可转换成且不违反任何一个期限,
定理得证。
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
jJn;iJn/2
whilei>1andA[i]>A[j]do
kJA[j];
A[j]JA[i];
A[i]Jk
jJi;
iJi/2
repeat
endINSERT
②procedureRESTORE(A,l,n)integeri,j,kxJA[n];
A[n]JA[l]
iJ1
jJ2*i
whilejif(jA[j+1])thenjJj+1endifif(x>A[j])thenA[i]JA[j];iJj;jJ2*i
elseiJnendifrepeatendRESTORE
3procedureHEAPSORT(A,n)integeri,k
fori=n/2to1step—1do
RESTORE(A,i,n)
repeat
fori=nto2step—1do
kJA[1];A[1]JA[i];A[i]Jk
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-1nmod(k-1)=1
②利用数学归纳法。
当n=1时,存在外部结点数目为1的k元树T,并且T中部结点的度为k;
假设当n我们将外部结点数为n(n为满足nwm,且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后面所描述的贪心规则对于所有的(q2,…,qn)生成一棵最优的k元归并树。
②当(q2,…,qn)=(3,7,8,9,15,16,18,20,23,25,28)时,画出使
用这一规则所得到的最优3元归并树。
解:
①通过数学归纳法证明:
对于n=1,返回一棵没有部结点的树且这棵树显然是最优的。
假定该算法对于(q-q2,…,qm),其中m=(k-1)s+1(0
成一棵最优树.
则只需证明对于(q「q2,…,qn),其中n=(k-1)(s+1)+1,也能生成最优
树即可。
不失一般性,假定q1棵树的WEIGH信息段的值。
于是q2,…,qk棵生成子树T,设T是一棵对于
(q1,q2,…,qQ的最优k元归并树。
设P是距离根最远的一个部结点。
如果
P的k个儿子不是q「q2,…,qk,则可以用5,q?
…,qk和P现在的儿子进行
交换,这样不增加T的带权外部路径长度。
因此T也是一棵最优归并树中的子树。
于是在T中如果用其权为q1+q2+…+qk的一个外部结点来代换T,则所生成的树
T是关于(q1+q2+…+qk,qk1,…,qn)的一棵最优归并树。
由归纳假设,在使用其权为qi+q2+…+qk的那个外部结点代换了T以后,过程TREE转化成去求取一
棵关于(qi+q2+…+qk,q「,…,qn)的最优归并树。
因此TREE生成一棵关于
(qi,q2,…,qn)的最优归并树。
6.2•修改过程ALL_PATHS使其输出每对结点(i,j)间的最短路径,这个新算法的时间和空间复杂度是多少?
ProcedureShortestPath(COST,n,A,Max)integeri,j,k
realCOST(n,n),A(n,n),Path(n,n),Max
forij1tondo
forjj1tondo
A(i,j)jCOST(i,j)
ifi丰jandA(i,j)丰MaxthenPath(i,j)jj
elsePath(i,j)j0
endif
repeat
repeat
forkj1tondo
forij1tondo
forjj1tondo
ifA(i,j)>A(i,k)+A(k,j)
thenA(i,j)jA(i,k)+A(k,j)Path(i,j)jPath(i,k)
endif
repeat
repeat
repeat
forij1tondo
forjj1tondo
print(“thepathofitojis”i)
kjpath(i,j)
whilek丰0do
print(,k)kjpath(k,j)
repeat
repeat
repeat
endShortestPath
时间复杂度0(n3),空间复杂度0(n2)
6.4.①证明算法OBST勺计算时间是0(n2)。
②在已知根R(i,j),0
的算法。
证明这样的树能在O(n)时间构造出来。
解:
①将C中元素的加法看做基本运算,则算法OBST的时间复杂性为:
nnmnnm
(R(i1,j)R(i,j1)1)(R(i1,im)R(i,im1)1)m2i0m2i0
n
2
(R(nm1,n)R(0,m1)nm1)O(n2)
m2
②ProcedureBuildTree(m,n,R,Root)
integerR(n,n),k
TreeNodeRoot,LR,RR
kJR(m,n)
ifk工0thendata(Root)Jk,
BuileTree(m,k-1,R,LR),BuileTree(k,n,R,RR)
left(Root)JLR,right(Root)JRR
elsedata(Root)Jm,left(Root)Jnull,right(Root)Jnull,endifendBuildTree
时间复杂性分析:
T(n)=c+T(k)+T(n-k-1),此递推式保证算法的时间复杂性为O(n),也可从递归的角度出发,递归的次数正是结点的个数,而每次递归时间复杂性为常数,所以算法的时间复杂度也为O(n)。
6.8•给出一个使得DKNAP算法6.7)出现最坏情况的例子,它使得|Si|=2i,0
还要求对