算法导论第三版第七章思考题

7-1

a.

(1) 初始时, x=A[1]=13,i=0,j=13 ;
(2) 令 j=j1=12A[12]>x ,故继续令 j=j1=11,A[11]<x ;令 i=i+1=1,A[1]x 。交换 A[1]A[11]A1={6,19,9,5,12,8,7,4,11,2,13,21}
(3) 令 j=j1=11,A[11]<x ;令 i=i+1=2,A[2]>x 。交换 A[2] A[11] 得到 A2={6,2,9,5,12,8,7,4,11,19,13,21}
(4) 令 j=j1=9,A[9]<x ;接下来令 i=39 ,都有 A[i]x ,直到 i=10,A[i]=19>x 。此时 i>j ,故可以直接返回 j=9 ,得到的序列为 A2={6,2,9,5,12,8,7,4,11,19,13,21}

b.

  1. 如果子数组以升序互不相同的元素排列,那么将重复 j=j1 直到 j=1 ,然后将进行一次 i=i+1=1 ,然后就会直接返回 j=1 j 最小只能访问到A[1],不会访问子数组以外的数;
  2. 无论如何首先 j 肯定至少进行一次j=j1=r=12,然后因为 x=A[p] ,所以第一次 i=i+1=p ,然后就得停止。交换 A[j]A[i] 之后 i<j ,所以至少还得进行一次 j=j1 ,所以 j r-1$。
  3. 因为至少会进行一次 i=i+1 ,所以 i 最小只能访问A[p];而且因为 A[j..r] 之间每个元素都大于等于 x ,所以重复i=i+1时,最多只能使 i=j+1 ,所以 i 最大只能访问到A[r]不会超出子数组 A[p..r] 的范围。

c.

根据上面b小问的分析即可得知。

d.

从算法第5行到第7行知,每次循环中 A[j+1..r]x ,从第8行到第10行可知, A[p...j]x 。每次循环中,若 i<j ,则交换 A[i]A[j] ,然后继续 j 的递减和i的递增,保持了 A[p..j]x A[j+1..r]>x ,所以 A[j+1..r]xA[p..j]x ,所以对于 A[p..j] 中的每个元素都小于或等于 A[j+1..r] 中的元素。

e.

QUICKSORT(A,p,r)
1 if p < r
2   q = HOARE-PARTITION(A,p,r)                                 
3   QUICKSORT(A,p,q)
4   QUICKSORT(A,q+1,r)

7-2

a.

此时算法的随机性完全没有影响,算法的时间复杂度为 O(n2)

b.

PARTITION_1(A,p,r)
1  x = A[r]
2  i = p
3  t = r
4  j = p
5  while j <= t
6    if A[j] > x
7      exchange A[j] with A[t]
8      t = t - 1
9    else if A[j] < x
10     exchange A[i] with A[j]
11     i = i + 1
12     j = j + 1
13   else j = j + 1
14 return i and j

c.

RANDOMIZED-PARTITION_1(A, p, r)
1 i = RANDOM(p, r)
2 exchange A[r] with A[i]
3 return PARTITION_1(A, p, r)

RANDOMIZED-QUICKSORT(A, p, r)
1 if p < r
2   int[] q = RANDOMIZED-PARTITION_1(A, p, r)
3   if q[1] == p and q[2] = r
4     return
5   RANDOMIZED-PARTITION_1(A, p, q[1] - 1)
6   RANDOMIZED-PARTITION_1(A, q[2] + 1, r)

d.

直接将 Zij={zi,zi+1,,zj} zi 定义为数组A中第 i 小的元素中的一个,则

Pr{zizj}=nzinij+nzjnij2ji+1

后面的分析是一样的。

7-3

a.

P(Xi)=1n ,所以 E[Xi]=P(Xi)=1n

b.

首先PARTITION过程的运行时间为 Θ(n) ,然后当主元为第 i 小的元素时,问题被分为规模分别为q1nq的两个子问题,运行时间分别为 T(q1)T(n1) ,所以

E[T(n)]=E[q=1nXq(T(q1)+T(nq)+Θ(n))]

c.

E[T(n)]=E[q=1nXq(T(q1)+T(nq)+Θ(n))]=q=1nE(Xq)E[T(q1)+T(nq)+Θ(n)]=q=1n1nE[T(q1)]+q=1n1nE[T(nq)]+q=1n1nΘ(n)=1nq=2n1E[T(q)]+1nq=0n1E[T(q)]+Θ(n)=2nq=2n1E[T(q)]+1n{E[T(0)]+E[T(1)]}+Θ(n)=2nq=2n1E[T(q)]+Θ(n)

d.

k=2n1klgk=k=2n/21klgk+k=n/2n1klgkk=1n/2klgn2+k=n/2n1klgn=lgn2n2+2n8+lgn3n22n8=n28lgn2+38n2lgn+n4lgn2n4lgnn28lgnn28lg2+38n2lgn=n22lgnn28

e.

假设对于某个正常数 a 和足够大的n,有 E[T(n)]anlgn

E[T(n)]=2nq=2n1E[T(q)]+Θ(n)2nq=2n1aqlgq+Θ(n)2an(n22lgnn28)+Θ(n)anlgnan4+Θ(n)anlgn

最后一步去适当的 a 使得an4Θ(n)<0即可。故 E[T(n)=Θ(nlgn)

7-4

a.

算法前面和快速排序是一样的,调用PARTITION后,递归调用了左边的子数组;然后通过将 p=q+1 ,并经过循环,对右边的子数组进行了快速排序操作,与递归调用快速排序是一样的,所以能正确的对数组A进行排序。

b.

当数组本身就是按升序排列的,那么每次PARTITION操作后,左边的数组大小都只比原先的小一,所以一共会递归调用 n 次,即栈深度为Θ(n)

c.

TAIL-RECURSIVE-QUICKSORT(A, p, r)
1 while p < r
2   q = PARTITION(A, p, r)
3   if q <=  (r+p)/2
4     TAIL-RECUISIVE-QUICKSORT(A, p, q-1)
5     p = q + 1
6   else
7     TAIL-RECURSIVE-QUICKSORT(A, q + 1, r)
8     r = q

7-5

a.

pi=A33(i1)(ni)n(n1)(n2)=6(i1)(ni)n(n1)(n2)

b.

px1/n=6(n21)(nn2)(n1)(n2)=3n(n2)2(n1)(n2)

n 时,上式等于 32 ,所以增加了 1/2 倍。

c.

三数取中法的好划分概率为

P=i=n/32n/3pi2n3n36(i1)(ni)n(n1)(n2)di=13n27(n2)

平凡实现为
P=2n/3n/3n=13

n 时,
P/P=13/9

增加了 4/9 倍。

d.

不知道。。。

7-6

不会。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值