算法导论第二章 思考题

算法导论第二章

思考题

2-1

  • 证明:
    已知插入排序的最坏情况运行时间为Θ(n2)Θ(n^{2}),且我们使用插入排序来排序长度为kkn/kn/k个子表。
    长度为kk的一个子数组,用插入排序其最坏情况运行时间为Θ(k2)Θ(k^{2}),且有n/kn/k个子表,得出Θ(nk×k2)Θ(\dfrac{n}{k} \times k^{2}),结果为Θ(nk)Θ(nk)

  • 举个例子:当一个总长度为nn的输入(n>1)(n > 1),经过一次归并排序递归后,将nn一分为二,也就是n/2n / 2,如果kk为代表的当前这次的长度n/2n / 2,则我们可以得出层数:
    lg(n/k)+1==log2(n/k)+1==log2(n/n2)+1==log2(2)+1==2lg(n/k)+1==log_{2}(n / k)+1==log_{2}(n / \dfrac{n}{2})+1==log_{2}(2)+1==2
    得到层数为2。
    同理,当我们再一次经过归并排序递归后,n/2n/2再次一分为22,也就是(n/2)/2==n/4(n/2)/2==n/4kkn/4n/4,代入上面的式子,得出层数3。
    我们可以得出,lg(n/k)+1lg(n/k)+1即为归并排序递归的层数,因为合并算法MERGE的最坏情况运行时间为Θ(n)Θ(n),得出nlg(n/k)+nnlg(n/k)+n,去掉常量,得出Θ(nlg(n/k))Θ(nlg(n/k))

  • ‎最大值是‎‎k=lgnk‎‎=‎‎lg‎‎n‎,如果我们替代,我们得到:‎
    Θ(nlgn+nlgnlgn)=Θ(nlgn)Θ(nlgn+nlg\dfrac{n}{lgn})=Θ(nlgn)
    如果‎k=f(n)>lgnk=f‎(n‎)>‎‎lg‎‎n‎‎,复杂性将是Θ(nf(n))Θ(nf(n))‎,它比合并排序的运行时间大

  • It’s constant factors, so we just figure out when insertion sort beats merge
    sort, exactly as we did in exercise 1.2.2, and pick that number for k.
    (这是常数因子,所以我们只找出插入排序比合并排序,完全像我们在练习 1.2.21.2.2中所做的那样,并选择该数字KK.)

2-2

BUBBLESORT(A)
1   for i = 1 to A.length - 1                       // i = 1,下标i从第一个元素一直循环到i大于A.length - 1停止
2       for j = A.length downto i + 1               // j = A.length,下标j从最后一个元素循环递减到小于i + 1停止
3           if A[j] < A[j - 1]
4               exchange A[j] with A[j - 1]         // 如果A[j]小于A[j - 1],则交换这两个元素的值
  • We need to prove that A’ consists of the original elements in A, although in (possibly) different order.
    (我们需要证明A’由A中的原始元素组成,尽管顺序可能不同。)

  • 循环不变式(2(2~4)4)
      (1)总是从最后一个元素开始递减,且后前一位元素进行判断交换
      (2)每循环一次后,A[j]A[j]A[j..A.length]A[j..A.length]中最小的元素
    证明:
        初始化:循环的第一次迭代ii为首元素,jj为尾元素,判断式为真,开始执行循环
        保持:进行A[j]A[j]A[j1]A[j - 1]的判断,如果A[j]>A[j1]A[j] > A[j - 1]则交换换元素中的数据,我们可以得知,A[j]A[j]将会是A[j]A[j1]A[j]和A[j-1]中最小的一个,同理,A[j]A[j]也会是A[j..A.length]A[j..A.length]中最小的。
        终止:因为每次循环后,A[j]A[j]总是A[j..A.length]A[j..A.length]中最小的,所以退出循环后,A[i]A[i]将会是A[i..A.length]A[i..A.length]中最小的数字

  • 循环不变式(1(1~4)4):
      (1)每次循一次后,A[1..i]A[1..i]都是排好序的
    证明:
        初始化:循环的第一次迭代ii为首元素,且循环至ii大于A.length1A.length-1,第一次判断式为真,开始执行循环
        保持:已经证明了每当执行完次(2(2~4)4)循环时,A[j]A[j]A[j..A.length]A[j..A.length]中最小的元素,得到当前循环每迭代循环一次,其A[1..i]A[1..i]将总是排序好的
        终止:当ii大于A.length1A.length-1终止,A[1..i]A[1..i]将是排序好的,也相当于说A[1..A.length1]A[1..A.length-1]是排序好的,最后一个元素不用排序,因为它一定是A中最大元素,也理应在最后一位

  • 最坏情况运行时间为Θ(n2)Θ(n^{2})

 BUBBLESORT(A)
 1   for i = 1 to A.length - 1				c1		n
 2       for j = A.length downto i + 1			c2   		①
 3           if A[j] < A[j - 1]				c3   		②
 4               exchange A[j] with A[j - 1]		c4   		②

   ①  j=2ntj\sum ^{n}_{j=2}t_{j}
   ②  j=2n(tj1)\sum ^{n}_{j=2}\left( t_{j}-1\right)

   该算法的运行时间(执行每条语句的运行时间之和)是:

   T(n)=C1n+C2j=2ntj+C3j=2n(tj1)+C4j=2n(tj1)T\left( n\right) =C_{1}n+C_{2}\sum ^{n}_{j=2}t_{j}+C_{3}\sum ^{n}_{j=2}\left( t_{j}-1\right)+C_{4}\sum ^{n}_{j=2}\left( t_{j}-1\right)

   其中我们注意到:

      j=1ntj\sum ^{n}_{j=1}t_{j} = (n(n+1)21)\left( \dfrac {n\left( n+1\right) }{2}-1\right)

      j=2n(tj1)\sum ^{n}_{j=2}\left( t_{j}-1\right) = n(n1)2\dfrac {n\left( n-1\right)}{2}

   最坏情况运行时间
   T(n)=C1n+C2(n(n+1)21)+C3(n(n1)2)+C4(n(n1)2)T\left( n\right) =C_{1}n+C_{2}\left( \dfrac {n\left( n+1\right) }{2}-1\right)+C_{3}\left( \dfrac {n\left( n-1\right)}{2}\right)+C_{4}\left( \dfrac {n\left( n-1\right)}{2}\right)

      =(C22+C32+C42)n2+(C1+C22C32C42)nC2=\left( \dfrac {C_{2}}{2}+\dfrac {C_{3}}{2}+\dfrac {C_{4}}{2}\right) n^{2}+\left(C_{1}+\dfrac {C_{2}}{2}-\dfrac{C_{3}}{2}-\dfrac{C_{4}}{2}\right)n-C_{2}

   我们可以表示为:an2+bn+can^{2}+bn+c
   忽略掉低阶项和最重要的项的常系数时,只剩下重要的项中的因子n2n^{2},得出运行时间为Θ(n2)Θ\left(n^{2}\right)

   与插入算法相比,感觉半斤八两吧

2-3

  • Θ(n)Θ(n)
  • 该算法的运行时间是Θ(n)Θ(n),与霍纳规矩相比,霍纳规矩的性能更好
Polynomial(A, n)     // A为a0..an,A.length == n
1   if n == 0
2       return A[A.length - n]
3   return A[A.length - n] + x * Polynomial(A, n - 1)
  • 算法导论第二章思考题2-3((自己看))
  • It should be fairly obvious, but the invariant of the loop is a sum that equals a polynomial with the given coefficients.
    (这应该是很明显的,但是循环不变式是一个等于给定系数的多项式的和。)

2-4

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章