复杂度分析
势能分析法
基本模型
设 \(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})\)
而众所周知的有 \(\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})\)