2.3-1
2.3-2
MERGE(A,p,q,r)
n1=q-p+1
n2=r-q
let L[1..n1+1] and R[1..n2+1] be new arrarys
for i=1 to n1
L[i]=A[p+i-1]
for j=1 to n2
R[j]=A[q+j]
i=1
j=1
for k=p to r
if L[i]<=R[j]
A[k]=L[i]
i=i+1
if i>L.length
A[k:]=R[i:]
else
A[k]=R[j]
j=j+1
if i>R.length
A[k:]=L[i:]
2.3-3
证明:
当n=2时
解式为:
T
(
n
)
=
n
l
g
n
=
2
T(n)=nlgn=2
T(n)=nlgn=2
递归式为:
T
(
n
)
=
2
T(n)=2
T(n)=2
假设当n=k时解式与递归式相等,则有:
T
(
n
)
=
k
l
g
k
=
2
T
(
k
2
)
+
k
T(n)=klgk=2T(\frac{k}{2})+k
T(n)=klgk=2T(2k)+k
当n=2k时(因为n为2的幂,因此这里归纳的一下步骤为2k):
解式为:
T
(
n
)
=
2
k
l
g
2
k
=
2
k
(
l
g
2
+
l
g
k
)
=
2
k
+
2
k
l
g
k
=
4
k
+
4
T
(
k
2
)
\begin{aligned}T(n) &=2klg2k\\ &=2k(lg2+lgk)\\ &=2k+2klgk\\ &=4k+4T(\frac{k}{2}) \end{aligned}
T(n)=2klg2k=2k(lg2+lgk)=2k+2klgk=4k+4T(2k)
递归式为:
T
(
n
)
=
2
T
(
k
)
+
2
k
=
2
(
2
T
(
k
2
)
+
k
)
+
2
k
=
4
k
+
4
T
(
k
2
)
\begin{aligned}T(n) &=2T(k)+2k\\ &=2(2T(\frac{k}{2})+k)+2k\\ &=4k+4T(\frac{k}{2}) \end{aligned}
T(n)=2T(k)+2k=2(2T(2k)+k)+2k=4k+4T(2k)
即解式跟递归式仍然相等,得证。
2.3-4
设排序A[1…n]最坏运行时间为T(n),T(n)由两部分组成,一部分是排序A[1…n-1],另一部分是将A[n]插入到A[1…n-1],由于是最坏情况,因此要比较n-1次,所以递归表达式为:
T
(
n
)
=
{
1
n-1
T
(
n
−
1
)
+
n
−
1
n>0
T(n)= \begin{cases} 1& \text{n-1}\\ T(n-1)+n-1& \text{n>0} \end{cases}
T(n)={1T(n−1)+n−1n-1n>0
2.3-5
问题描述:
A[1:n]为一个有序序列,采用二分查找查找A中与v相等的值。
递归伪代码:
low=1
high=n
func search(low, high):
mid=(1+n)/2
if A[mid]>v:
search(low, mid-1)
else A[mid]<v
search(mid+1, high)
else
print mid, A[mid]
思考二分查找,设查询A[1…n]的时间为T(n)那么,查询A[1…(1+n)/2]或A[(1+n)/2,n]的时间为T(n/2),因为长度恰好为其一半,因此二分查找的递归表达式为:T(n)=T(n/2)+a,a为将一个数列等分为两份的操作所用时间(由于都是数组下标操作,因此每一次的操作时间是一样的)。
假设,n为2的幂,并且考虑到最坏情况,那么有:
T
(
2
k
)
=
T
(
2
k
−
1
)
+
a
=
T
(
2
k
−
2
)
+
2
a
.
.
.
=
T
(
1
)
+
k
a
\begin{aligned}T(2^k) &=T(2^{k-1})+a\\ &=T(2^{k-2})+2a\\ &...\\ &=T(1)+ka \end{aligned}
T(2k)=T(2k−1)+a=T(2k−2)+2a...=T(1)+ka
其中T(1)为常数c,将
2
k
2^k
2k代换回n有,
T
(
n
)
=
c
+
k
l
g
n
T(n)=c+klgn
T(n)=c+klgn,即最坏情况运行时间为
Θ
(
l
g
n
)
\Theta(lgn)
Θ(lgn)
2.3-6
二分查找的作用是在 O ( l g n ) O(lgn) O(lgn)时间找到某一个元素,或者范围,但是INSERTION-SORT的5~7行的功能是找到,插入,并将数组中元素依次移动。如果插入跟依次移动所花费的时间为常数时间的话,那么就能将最坏情况总运行时间改进到 Θ ( n l g n ) \Theta(nlgn) Θ(nlgn)。反之,则不能。
*2.3-7
用暴力破解的方法可以轻易知道其算法时间为
Θ
(
n
2
)
\Theta(n^2)
Θ(n2),即,查找任意两个数字组成的和并与
x
x
x进行对比。
换一种思路,先计算,
d
=
x
−
S
[
i
]
d=x-S[i]
d=x−S[i],然后通过二分查找查找
d
d
d是否在S内。
计算
d
=
x
−
S
[
i
]
d=x-S[i]
d=x−S[i]需计算n次,后续查找需要lgn次,因此其运行时间为
Θ
(
n
l
g
n
)
\Theta(nlgn)
Θ(nlgn)