算法导论

算法基础

循环不变式

  • 初始化:循环第一次迭代前,不变式为真;
  • 保持:如果循环的某次迭代前不变式为真,那么下次迭代前它仍为真;
  • 终止:循环终止时,不变式的性质有助于证明算法的正确性。

渐进记号

  • 渐进紧确界\(\Theta(g(n))=\{f(n)\mid\)存在正常量\(c_1,c_2,n_0\),使得对所有\(n\ge n_0\),有\(0\le c_1g(n)\le f(n)\le c_2g(n)\}\)
  • 渐进上界\(O(g(n))=\{f(n)\mid\)存在正常量\(c,n_0\),使得对所有\(n\ge n_0\),有\(0\le f(n)\le cg(n)\}\)
  • 渐进下界\(\Omega(g(n))=\{f(n)\mid\)存在正常量\(c,n_0\),使得对所有\(n\ge n_0\),有\(0\le cg(n)\le f(n)\}\)

求解递归式

代入法

  • 猜测解的形式;
  • 用数学归纳法证明解的正确性。

递归树法

  • 画出递归树;
  • 求解每一层的代价;
  • 对所有层的代价求和。

主定理法

\(a\ge1\)\(b>1\)是常数,\(f(n)\)是一个函数,\(T(n)\)是定义在非负整数上的递归式: \[ T(n)=aT(\frac{n}{b})+f(n) \] 那么\(T(n)\)有如下渐进界:

  • 若对某个常数\(\varepsilon>0\)\(f(n)=O(n^{\log_ba-\varepsilon})\),则\(T(n)=\Theta(n^{\log_ba})\)
  • \(f(n)=\Theta(n^{\log_ba})\),则\(T(n)=\Theta(n^{\log_ba}\lg n)\)
  • 若对某个常数\(\varepsilon>0\)\(f(n)=\Omega(n^{\log_ba+\varepsilon})\),且对某个常数\(c<1\)和所有足够大的\(n\)\(af(n/b)\le cf(n),\)\(T(n)=\Theta(f(n))\)

简单来说即比较\(f(n)\)\(n^{\log_ba}\)的值:若\(n^{\log_ba}\)更大,则对应情况1;若\(f(n)\)更大,则对应情况3;若大小相当,则乘上一个对数因子,对应情况2。

另外这三种情况并未覆盖\(f(n)\)的所有可能性,情况1和2、2和3之间有一定间隙。

分治算法


算法导论
https://shuusui.site/blog/2024/11/05/algorithm-intro/
作者
Shuusui
发布于
2024年11月5日
更新于
2024年11月5日
许可协议