" /> " />
主定理是用来快速计算递归算法时间复杂度的公式。很多分治算法(如归并排序、快速排序)都可以用它来分析。
主定理处理这种形式的递归式:
T(n) = a * T(n/b) + f(n)
用做蛋糕来理解:
如果 f(n) = O(n^c),其中 c < log_b(a)
则:T(n) = Θ(n^{log_b(a)})
例子: 归并排序
// T(n) = 2*T(n/2) + O(n)
// a=2, b=2, f(n)=O(n)
// log_b(a) = log_2(2) = 1
// f(n) = O(n^1),刚好相等,看情况2
如果 f(n) = Θ(n^{log_b(a)})
则:T(n) = Θ(n^{log_b(a)} * log n)
例子: 归并排序(正确分析)
void mergeSort(vector<int>& arr, int left, int right) {
if (left >= right) return;
int mid = (left + right) / 2;
mergeSort(arr, left, mid); // T(n/2)
mergeSort(arr, mid+1, right); // T(n/2)
merge(arr, left, mid, right); // O(n)
}
// T(n) = 2*T(n/2) + O(n)
// a=2, b=2, log_2(2)=1
// f(n)=n^1,所以 T(n) = O(n log n)
如果 f(n) = Ω(n^c),其中 c > log_b(a)
则:T(n) = Θ(f(n))
例子: 特殊的递归
// T(n) = 2*T(n/2) + O(n^2)
// a=2, b=2, log_2(2)=1
// f(n)=n^2 > n^1,所以 T(n) = O(n^2)
// 例1:二分查找
T(n) = T(n/2) + O(1)
a=1, b=2, f(n)=O(1)
log_b(a) = 0, f(n)=n^0
情况2:T(n) = O(log n)
// 例2:普通递归
T(n) = 2*T(n/2) + O(1)
a=2, b=2, f(n)=O(1)
log_b(a) = 1 > 0
情况1:T(n) = O(n)
// 例3:特殊分治
T(n) = 4*T(n/2) + O(n)
a=4, b=2, f(n)=O(n)
log_b(a) = 2 > 1
情况1:T(n) = O(n^2)
想象天平⚖️:
主定理让复杂的递归分析变得像查表一样简单!