为排序算法编写递归关系

时间:2014-09-17 01:00:06

标签: algorithm big-o recurrence

我正在了解复发关系。我可以解决它们并弄清楚它们的界限,但我不确定的是如何为特定算法提出递归关系。这是我书中的一个例子:

// Sort array A[] between indices p and r inclusive.

SampleSort (A, p, r) {

     // Base Case: use HeapSort
     //
     if (r - p < 12) {
        HeapSort(A, p, r) ;
     }


     //  Break the array into 1st quarter, 2nd quarter and second half
     //
     n = r - p + 1 ;        // number of items in A[p..r] inclusive
     q1 = p - 1 + n/4 ;     // end of 1st quarter
     q2 = q1 + n/4 ;        // end of 2nd quarter


     //  Sort each of the 3 pieces
     //  using SampleSort recursively, Insertion-Sort and Heap-Sort
     //
     SampleSort (A, p, q1) ;
     InsertionSort (A, q1 + 1, q2) ;
     HeapSort (A, q2 + 1, r) ;


     // Merge the 3 sorted arrays into 1 sorted array
     //
     Merge (A, p, q1, q2) ;     // Merge 1st & 2nd quarter
     Merge (A, p, q2, r) ;      // Merge 1st & 2nd halves

     return  ;
}

它还说我可以假设InsertionSort,HeapSort和Merge是Θ(n2),Θ(n log n)和Θ(n)。 这是我到目前为止所提出的: 我把阵列分成三块。前两个是原始数据的1/4,第三个(一半)是数据的1/2。 所以我现在有T(n)= 2T(n / 4)+ T(n / 2)。 不知道从哪里开始。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

正如大卫在评论中指出的那样,算法中只有一个递归调用。所以你的递归关系看起来像这样:

      SampleSort   InsertionSort        HeapSort         Merges
          |             |                  |               |
          v             v                  v               v
T(n) = T(n / 4) + O((n / 4)^2) + O((n / 2) log (n / 2)) + O(n)
     = T(n / 4) + O(n^2)

使用Master theorem (Case 3),我们得出结论

T(n) = O(n^2)     (worst case)

由于SampleSort项上的n涉及HeapSort个项n / 2 Ω((n / 2) log (n / 2)) = Ω(n log n),其中案例T(n) = Ω(n log n) (best case) 最佳,我们知道

{{1}}