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

来源:互联网 发布:网络热血传奇沙巴克 编辑:程序博客网 时间:2024/06/04 20:03

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=1j最小只能访问到A[1],不会访问子数组以外的数;
  2. 无论如何首先j肯定至少进行一次j=j1=r=12,然后因为x=A[p],所以第一次i=i+1=p,然后就得停止。交换A[j]A[i]之后i<j,所以至少还得进行一次j=j1,所以jr-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]xA[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 < r2   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 = p3  t = r4  j = p5  while j <= t6    if A[j] > x7      exchange A[j] with A[t]8      t = t - 19    else if A[j] < x10     exchange A[i] with A[j]11     i = i + 112     j = j + 113   else j = j + 114 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 < r2   int[] q = RANDOMIZED-PARTITION_1(A, p, r)3   if q[1] == p and q[2] = r4     return5   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 < r2   q = PARTITION(A, p, r)3   if q <=  (r+p)/24     TAIL-RECUISIVE-QUICKSORT(A, p, q-1)5     p = q + 16   else7     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 0
原创粉丝点击