算法导论练习 2.3 Designing algorithms

1

{3, 9, 26, 38, 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

merge(A, p, q, r)

m = q - q + 1
n = r - q
let L[1..m] and R[1..n] be new arrays
for i = 1 to m
	L[i] = A[p + i - 1]
for j = 1 to n
	L[j] = A[q + j]
i = j = k = 1
while i <= m and j <= n
	if L[i] <= R [j]
		A[k++] = L[i]
		++i
	else
		A[k++] = L[j]
		++j
while i <= m
	A[k++] = L[i++]
while j <= n
	A[k++] = L[j++]

3

对于 n = 2 0 n = 2^0 n=20 T ( 2 ) = 2 T(2)=2 T(2)=2,满足 T ( n ) = n lg ⁡ n T(n)=n\lg n T(n)=nlgn.
假设 n = 2 k n = 2^k n=2k 满足 T ( n ) = n lg ⁡ n T(n)=n\lg n T(n)=nlgn,根据递归式,当 n = 2 k + 1 n = 2^{k+1} n=2k+1时,
T ( n ) = T ( 2 k + 1 ) = 2 T ( 2 k ) + 2 k + 1 = 2 × 2 k lg ⁡ 2 k + 2 k + 1 = 2 k + 1 lg ⁡ 2 k + 1 = n lg ⁡ n \begin{aligned} T(n)&= T(2^{k+1}) \\ &= 2T(2^k)+2^{k+1} \\ &=2\times2^k\lg 2^k+2^{k+1} \\ &=2^{k+1}\lg2^{k+1} \\ &=n\lg n \end{aligned} T(n)=T(2k+1)=2T(2k)+2k+1=2×2klg2k+2k+1=2k+1lg2k+1=nlgn
由数学归纳法,对于 n = 2 k , k ≥ 0 n = 2^k,k\geq0 n=2k,k0 T ( n ) = n lg ⁡ n T(n)=n\lg n T(n)=nlgn成立。


4

T ( n ) = { Θ ( 1 ) i f   n = 1 T ( n − 1 ) + Θ ( n ) i f   n > 1 T(n)=\left\{ \begin{array}{lcl} \Theta(1)& &{\rm if}\ n=1\\ T(n-1)+\Theta(n)& &{\rm if}\ n>1 \end{array} \right. T(n)={Θ(1)T(n1)+Θ(n)if n=1if n>1


5

binarySearch(A, n, x)

left = 1
reight = n
while left < right
	mid = (left + right) / 2
	if A[mid] == x
		return mid
	else if A[mid] > x
		right = mid - 1
	else if A[mid] < x
		left = mid + 1
return NIL

6

不能。尽管使用二分搜索可以更快地找到插入位置,但是由于数组本身的特性,插入的时间复杂度依然是 Θ ( n ) \Theta(n) Θ(n),所以不能用二分搜索来优化插入排序。


7 ★

  • 先调用归并排序mergeSort来对数组进行非递减排序,这一步时间复杂度为 Θ ( n lg ⁡ n ) \Theta(n\lg n) Θ(nlgn)
  • 然后用双指针法来寻找是否存在两个元素之和为sum,这一步时间复杂度为 Θ ( n ) \Theta(n) Θ(n)
  • 总的时间复杂度是 Θ ( n lg ⁡ n ) \Theta(n\lg n) Θ(nlgn)

findSum(A, n, sum)

left = 1
right = n
while left < right
	if A[left] + A[right] == sum
		return left, right
	else if A[left] + A[right] < sum
		++left
	else
		--right
return NIL
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值