high
:
x>A(p2):
low
:
else:
low
←p1;return
←p2;return
←p1-1
←p2+1
←p1+1;high
←p2-1
endcase
repeat
j←0
endThriSearch
g(n)
n足够小
T(n)=
f(n)
T(n/3)
否则
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))
最好,
平均,
最坏
15.对于含有
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个,则满足Ek=Ik+2k,考察原树的外部路径长度为
Ek+1=Ek-(h-1)+2h,
内部路径长度为I
k+1
=I+(h-1),所以E=I
+2k+h+1=I
+2k+2=I
k+1
+2(k+1),
k
k+1k
k+1
综合①②③知命题成立。
16.以比较为基础(基本操作)的分类算法最坏情况的时间下界是什么?
答:
(nlogn)
17对线性存储的有序表中元素的以比较为基础的检索算法最坏时间的下界是什么?
简要说明理由。
答:
log(n1)
对线性存储的有序表中元素的以比较为基础的检索算法的执行过程都可以
用二元判定树来描述。
该树的每个内结点表示一次元素比较,因此对检索的最坏情况而言,该树最少含有n个不同的内结点。
检索算法最坏时间不大于该树中由根到一个叶子的最长路径长(树高)。
对有n个结点的二元树其最小树高为log(n1),所以对线性存储的有序表中元素的以比较为基础的检索算法最坏时间的下界是log(n1)。
18.简要说明选择问题算法中二次取中值规则的作用。
答:
通过选择划分元素V使其尽量靠近元素集合的中间可以得到一个最坏情况时间复杂度是O(n)的选择算法。
使用二次取中值规则可以选出满足要求的划分元素V。
19.给出斯特拉森矩阵乘法算法执行时间的递归关系式,并对其求解计算时间复杂度。
答:
斯特拉森矩阵乘法算法执行时间的递归关系式为:
b
n
2
T(n)=
2
n
2
7T(n/2)an
其中a和b是常数。
求解这个递归式,得
T(n)7[7T(n/4)a(n/2)2]
an2
72T(n/4)
an2(17/4)
72[7T(n/8)
a(n/4)2]
an2(1
7/4)
7kT
(1)
an2[1
7/4(7/4)2
...
(7/4)k1]
7k
an2[(7/4)k
1]/(7/41)
(c
1)7k
(c
1)nlog7
O(nlog7)
O(n2.81)
20.通过手算证明(4.9)和(4.10)
式确实能得到C11,C12,C21和C22的正确值。
P=(A+A
)(B
11
+B)
T=(A
11
+A)B
22
11
22
22
12
Q=(A21+A22)B11
U=(A
21-A11)(B11+B12)
R=A(B
12
-B)
V=(A
12
-A
22
)(B
+B)
11
22
21
22
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
=A11B12-A11B22+A11B22+A12B22
=A11B12+A12B22
=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
21.过程MERGESORT的最坏情况时间是O(nlogn),它的最好情况时间是什么?
能说归并分类的时间是Θ(nlogn)吗?
最好情况:
是对有序文件进行排序。
分析:
在此情况下归并的次数不会发生变化----log(n)次
归并中比较的次数会发生变化(两个长n/2序列归并)
最坏情况
两个序列交错大小,需要比较n-1次
最好情况
一个序列完全大于/小于另一个序列,比较n/2次差异都是线性的,不改变复杂性的阶
因此最好情况也是nlogn,平均复杂度nlogn。
可以说归并分类的时间是Θ(nlogn)
22.写一个“由底向上”的归并分类算法,从而取消对栈空间的利用。
答:
见《数据结构》
算法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–1
算法
THENMerge(R,i,i+length–1,n.X)
ELSEFORj=iTOnDOXj←Rj▌
MSort(R,n)//直接两路合并排序算法,X是辅助文件,其记录结构
与R相同
MS1[初始化]
length1.
MS2[交替合并]
WHILElength(MPass(R,n,length.X).
length2*length
iflength>n
thenFORj=1TOnDORj
elseMPass(X,n,length
length2*length)
endif
.R).
←Xj
)▌
23.什么是约束条件?
什么是可行解?
什么是目标函数?
什么是最优解?
并举例说明。
答:
有一类问题,解由输入的某个子集组成,但是这个子集必须满足某些事先给定的条件。
那些必须满足的条件称为约束条件。
满足约束条件的子集称为可行解。
为了衡量可行解的优劣,事先也给出一定的标准,这些标准一般以函数形式给出,称为目标函数。
使目标函数取极值的可行解称为最优解。
26.什么是贪心方法?
给出使用SPARKS语言描述的贪心方法的抽象化控制。
答:
对求取最优解问题,选取一种度量标准,将输入按度量标准排序,并按此序一次输入一个量。
如果这个输入和前面输入产生的在这种度量意义下的部分最优解加在一起产生一个可行解,将其加入形成新的在这种度量意义下的部分最优解;若不能构成一个可行解,则去掉该输入;重复此过程直到将输入枚举完成。
这种能够得到某种度量意义下的最优解的分级处理方法称为贪心方法。
贪心方法的SPARKS语言描述的抽象化控制为:
ProcedureGREEDY(A,n)
soltion
fori1tondo
xSELECT(A)
ifFEASIBLE(soltion,x)
thensoltion
UNION(soltion,x)
endif
repeat
return(soltion)
endGREEDY
24.①求以下情况背包问题的最优解,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-KNAPSACK所生成的解,FO(I)是一个最优解。
问FO(I)/FG(I)是多少?
③当物品按wi的非降次序输入时,重复②的讨论。
解:
①按照pi/wi的