时间复杂度

时间复杂度分析

递归操作

主定理

摊还分析

\(n\) 次操作总复杂度为 \(T(n)\),每次操作复杂度 \(O(\frac{T(n)}{n})\)

\(T(n)\)

定义新操作 \(multipop(k)\) 一次性弹出 \(k\) 个数,操作 \(n\) 次,同时有 \(push\;pop\)

二进制

每次给一个 \(k\) 位二进制串最低位 \(+1\),初始为全 \(0\),每次进位 \(O(1)\)

聚合法

eg1:所有 \(pop\) 的操作最多执行 \(n\) 次,所以是 \(T(n)=O(n)\)

eg2:最低位每次都要变 \(O(n)\) 倒数第二位每两次变一次 \(O(\frac n2)\)

\[T(n)=\sum_{i=0}^{k-1} \frac{n}{2^i} \leq 2n \]

记帐法

保证每次自己的存款 \(\geq 0\) 即可

eg1:设 \(push\) 表示花 \(1\) 元,存 \(1\) 元,\(pop/multipop\)\(1\)

\(pop/multipop\) 数少于 \(push\) 数,存款 \(\geq 0\)

最多 \(push\) \(n\)\(T(n)=2n\)

eg2:\(0 \to 1\)\(1\) 元,存 \(1\) 元,\(1 \to 0\)\(0\)

每次出现 \(1\) 必然原位置 \(0\) 存了 \(1\) 元变回来,存款 \(\geq 0\)

最多 \(n\)\(1\)\(T(n)=2n\)

例题

1.\(vector\) 初始空间为 \(0\),第一次插入变 \(1\) 后面每次空间到达上界,空间变为 \(2\)倍,插入/扩展每个元素都是 \(O(1)\)

聚合法

设扩张了 \(k\) 次,扩展总复杂度 $$O(\Sigma_{i=1}^{k} 2^{i-1} =2^k-1)$$

\[2^{k-1} \lt n \leq 2^k \]

\[2^{k} \lt 2n \]

插入 \(O(n)\)\(T(n) \lt 3n-1\)

2.对 \(a_1,.....a_n\) 两两求 \(gcd\) 得所有数 \(gcd\) 的复杂度

单次 \(gcd\) \(O(\log \frac{min(a,b)}{gcd(a,b)})+\Theta (1)\)

势能法

\(a_i\) 每次实际操作复杂度

构造势能函数 \(\phi(i)\),且 \(b_i=\phi(i)-\phi(i-1)\)

\[\sum a_i=\sum b_i+\phi(0)-\phi(n) \]

posted @ 2023-07-10 21:12  xyzfrozen  阅读(21)  评论(0)    收藏  举报