我正在了解复发关系。我可以解决它们并弄清楚它们的界限,但我不确定的是如何为特定算法提出递归关系。这是我书中的一个例子:
// 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)。 不知道从哪里开始。任何帮助将不胜感激!
答案 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}}