复杂度分析

势能分析法

基本模型

\(S_i\) 为第 \(i\) 状态,\(O(i)\) 为前 \(i\) 个状态消耗的实际复杂度,\(\Phi(S)\) 为势能函数。

\(\Delta O\) 可表示为 \(\Delta O\le \Delta\Phi+c\),则所有操作的复杂度为 \(O\le \Phi(S_n)-\Phi(S_1)+O(\sum c)\)

观察 \(\Phi\) 函数和复杂度函数的相关性。

核心:观察操作模式,构建 \(\Phi\) 函数。对 \(\Delta O\)\(\Delta \Phi\) 建立等式关系,用 \(\Phi\) 的变化替代复杂度变化。

单调队列复杂度

状态定义为此时的单调队列,令 \(\Phi(S)=|S|\)\(c_i\) 为入队元素数量,则 \(\Delta O=\Phi(S_i)+c_i-\Phi(S_{i+1})+c_i=\Delta \Phi+2c_i\),于是复杂度为 \(O(2n)=O(n)\)

二进制加法复杂度

对二进制高精数重复 \(n\)\(+1\) 模拟操作,求分析复杂度。

\(\Phi(S)=S\) 末尾连续 \(1\) 的长度,则 \(\Delta \Phi=\Phi(S_i)-1\)\(\Delta O=\Phi(S_i)= \Delta \Phi+1\),故时间复杂度 \(O(2n)=O(n)\)

多数 \(\bm\gcd\) 复杂度

https://zhuanlan.zhihu.com/p/344094740

引理:对两数 \(a,b\) 用辗转相除法求 \(\gcd\) 的复杂度为 \(O(\log \dfrac{\min(a,b)}{\gcd(a,b)})\)

状态定义为此时的 \(\gcd\),令 \(\Phi(S)=O(\log S)\),则 \(\Delta O=O(\log \dfrac{\min(S_i,a_i)}{\gcd(S_i,a_i)})\le O(\log\dfrac{S_i}{S_{i+1}})=\Delta \Phi\),于是复杂度 \(O(\log W)\)

其他经典分析

\(O(\sum_{d\mid n}\sqrt{d})\)\(O(\sum_{d\mid n}\dfrac{1}{d})\)

\[\begin{aligned} & \sum_{d\mid n}\frac{1}{d} \\ & =\prod_{i=1}^k(1+\frac{1}{p_i}+\cdots+\frac{1}{p_i^{\alpha_i}}) \\ & \le \prod_{i=1}^k\frac{p_i}{p_i-1} \\ & = \dfrac{n}{\varphi(n)} \end{aligned} \]

而众所周知的有 \(\varphi(n)=\Omega\left(\frac{n}{\log \log n}\right)\),从而 \(\sum_{d\mid n}\frac{1}{d}=O(\log \log n)\)

\(O(\sum_{i=1}^m\sqrt{\dfrac{n}{i}})\)

yyc 2023/5/3 9:38:37

嗯,考虑这个式子,当 \(n\) 增加 \(1\) 的时候,用新的值 \(\sqrt{nm+m}\) 减去原来的值 \(\sqrt{nm}\)

yyc 2023/5/3 9:38:49

然后等于 \(O(m/n)\)

yyc 撤回了一条消息

yyc 2023/5/3 9:39:16

证毕

yyc 2023/5/3 9:40:02

然后等于 \(O(m/n)\)

不是,是等于 \(O(\sqrt{m/n})\)

posted @ 2023-07-10 09:47  Network_Error  阅读(16)  评论(0)    收藏  举报