主定理(但是没有证明)
我自己写的不严谨的:主定理测试姬,没有判 \(af(n/b)\le cf(n)\) ,如果误导您了望谅解
没有证明绝对不是因为我不会,证明可看:重谈主定理(master定理)及其证明
这篇文章主要是写给自己看的,写的不好。
公式有部分错的,主要还是看百度百科,因为我这个蒟蒻暂时用不到,就没写。
怎么记忆呢?聪明的我用了chatgpt生成记忆方法如下:
为了记忆主定理公式,我建议采用以下步骤:
Step 1: 写下主定理公式的基本形式: $$T(n)=aT(\lceil\frac{n}{b}\rceil)+O(n^d)$$
Step 2: 确定每个参数的含义:
- \(n\):问题的规模
- \(a\):递归子问题的数量
- \(\frac{n}{b}\):每个递归子问题的规模
- \(d\):递归以外的计算工作的时间复杂度
Step 3: 按照\(d\)与\(\log_ba\)的关系分类讨论:
情况1: 如果\(d > \log_ba\),则递归以外的计算工作占据主导地位,因此时间复杂度为\(O(n^d)\)。
情况2: 如果\(d = \log_ba\),则递归和递归以外的计算工作对时间复杂度的贡献相当,因此时间复杂度为\(O(n^d \log n)\)。
情况3: 如果\(d < \log_ba\),则递归的规模增长速度占主导地位,因此时间复杂度为\(O(n^{\log_ba})\)。
Step 4: 将所有情况整合到一起,形成最终的记忆公式:
通过按照这些步骤记忆和理解主定理公式,您将能够轻松地计算和推导出递归算法的时间复杂度。
接着就是下一个主定理公式。
举例子。
- 例一: \(T(n)=4T(\frac{n}{2})+n\) ,此时 \(a = 4, b = 2, d = 1\),\(1<\log_24=2\),所以\(T(n)=O(n^{\log_ba})=O(n^{\log_24})=O(n^2)\)
- 例二: \(T(n)=2T(\frac{n}{2})+n\) ,此时 \(a = 2, b = 2, d = 1\),\(1=\log_22=1\),所以\(T(n)=O(n^d\log n)=O(n^1\log n)=O(n\log n)\)
- 例三: \(T(n)=4T(\frac{n}{2})+n^3\) ,此时 \(a = 4, b = 2, d = 3\),\(3>\log_24=2\),所以\(T(n)=O(n^d)=O(n^3)\)
- 例四: \(T(n)=2T(\frac{n}{2})+n\log n\) ,此时 \(a = 2, b = 2, k = 1\),所以\(T(n)=O(n^{\log_ba}\log^{k+1}n)=O(n\log^2 n)\)
真题(洛谷 SCP):
-
此时 \(a = 3, b = 2, d = 1\),\(1<\log_23=\text{不知道是多少总之肯定大于1}\),所以\(T(n)=O(n^{\log_ba})=O(n^{\log_23})\)
-
此时 \(a = 9, b = 3, d = 1\),\(1<\log_39=2\),所以\(T(n)=O(n^{\log_ba})=O(n^{\log_39})=O(n^2)\)
-
此时 \(a = 1, b = \frac{\sqrt{2}}{2+\sqrt{2}}, k = 1\),\(n^{\log_ba}\lg^kn=n^{\log_{\text{b}}1}\lg n=\lg n\),所以\(T(n)=O(n^{\log_ba}\lg^{k+1}n)=O(n^{\log_{\text{b}}1}\lg^2n)=O(\lg^2 n)\)。
-
主要看 4,5 题。
T4为 \(T(n)=2T(\frac{n}{2})+1=2T(\frac{n}{2})+n^0\),得到 \(O(n)\)
T5为 \(T(n)=2T(\frac{n}{2})+n\),得到 \(O(n\log n)\)