算法导论作业2.3

算法导论作业2.3

2.3-1

3,9,26,28,41,49,52,57
3,26,41,52
9,38,49,57
3,41
26,52
38,57
9,49
3
41
52
26
38
57
9
49

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(n1)+n1n-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(2k1)+a=T(2k2)+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=xS[i],然后通过二分查找查找 d d d是否在S内。
计算 d = x − S [ i ] d=x-S[i] d=xS[i]需计算n次,后续查找需要lgn次,因此其运行时间为 Θ ( n l g n ) \Theta(nlgn) Θ(nlgn)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值