主定理(但是没有证明)

我自己写的不严谨的:主定理测试姬,没有判 \(af(n/b)\le cf(n)\) ,如果误导您了望谅解

没有证明绝对不是因为我不会,证明可看:重谈主定理(master定理)及其证明

这篇文章主要是写给自己看的,写的不好。

公式有部分错的,主要还是看百度百科,因为我这个蒟蒻暂时用不到,就没写。

\[\text{如果有} T(n)=aT(\lceil\frac{n}{b}\rceil)+O(n^d) \]

\[\text{其中}n\text{问题规模,}a\text{为递推子问题数量,}\frac{n}{b}\text{为每个子问题的规模,}f(n)\text{为递推以外进行的计算工作。} \]

\[\text{那么有:} \]

\[T(n)=\begin{cases} O(n^d) & \text{如果} d>\log_ba \\ O(n^d \log n) & \text{如果} d=\log_ba \\ O(n^{\log_ba}) & \text{如果} d<\log_ba \end{cases} \]


怎么记忆呢?聪明的我用了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)=\begin{cases} O(n^d) & \text{如果} d>\log_ba \\ O(n^d \log n) & \text{如果} d=\log_ba \\ O(n^{\log_ba}) & \text{如果} d<\log_ba \end{cases} \]

通过按照这些步骤记忆和理解主定理公式,您将能够轻松地计算和推导出递归算法的时间复杂度。


接着就是下一个主定理公式。

\[\text{如果有} T(n)=aT(\lceil\frac{n}{b}\rceil)+n^{\log_ba}\log^k n \]

\[\text{则有} T(n)=n^{\log_ba}\log^{k+1} n \]


举例子。

  • 例一: \(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):

posted @ 2023-08-17 10:44  ZnPdCo  阅读(52)  评论(0编辑  收藏  举报