(简记)时间复杂度分析 $\Omicron,\Theta,\Omega$ 的区别 主定理
严谨定义请前往OI-wiki
渐进符号定义介绍
备考初赛。为了方便记忆,给出如下定义:
-
对于 \(f(n)=\Theta(g(n))\),我们恰可以用 \(g(n)\) 乘上两个非 \(0\) 常数分别拟合出 \(f(n)\) 的上下界(可以取等号)。
-
对于 \(f(n)=\Omicron(g(n))\),我们仅可以用 \(g(n)\) 乘上一非 \(0\) 常数分别拟合出 \(f(n)\) 的上界(可以取等号)。
-
对于 \(f(n)=\Omega(g(n))\),我们仅可以用 \(g(n)\) 乘上一非 \(0\) 常数分别拟合出 \(f(n)\) 的下界(可以取等号)。
实际运用 \(\Theta,\Omicron\) 较多,毕竟只能知道下界你还跑什么程序。(?)
需要注意:
-
\(\forall a\neq 1,\log_a n=\Omicron(\log_2 n)\),因此复杂度分析中对数底数一般不写。
-
实际上许多选手在时间复杂度分析时会直接写 \(O\) 而不是 \(\Omicron\) 即 \(\text{Omicron}\) 符号,毕竟好打很多。而且多数我们遇到的题目在 LCT 的势能分析还有势能线段树等场景下,我们的复杂度分析都只能给出上界,毕竟复杂度的影响因素还有实际操作与数据,这也包括某些根号题。
注意此处给出例子线段树合并这一 trick 实际上是有下界的,即一条链且每个线段树单点操作相同情况,所以应该也能用 \(\Theta\) 符号。
主定理
用于求解一类递归问题的复杂度。
且第二种情况应有 \(af(n)\le cf(\frac{n}{b})\),\(n\) 足够大且 \(\exist c<1\) 满足该条件。
一句话记忆:计算 \(\log_b a\),如果 \(f(n)\) 与 \(n^p\) 有关的部分可以被 \(n^{\log_b a}\) 完全覆盖,对数强相关总复杂度多一个 \(\log\)。否则考虑对于 \(n^p\) 有关部分找到的是上界还是下界,上 \(n^{\log_b a}\),下 \(f(n)\)。
一些常用的时间复杂度分析
调和级数
如果针对优化后的埃氏筛,这个东西应该是:
额这是怎么来的呢请查阅百科已经超出了我的知识范畴(通俗易懂的埃氏筛时间复杂度分析)。
练习题
-
\(T(n)=2T(\frac{n}{2})+1\)
-
\(T(n)=T(\frac{n}{2})+n\)
-
\(T(n)=T(\frac{n}{2})+\log n\)
-
\(T(n)=T(\frac{n}{2})+1\)
-
给出如下代码:
unsigned int ans = 0;
void val(int n) {
for (int i = 1; i <= n; ++ i)
for(int j = 0; j < n; j += i)
ans += rand();
}
void calc(int n) {
if (n <= 1) val(n);
else calc(n / 2), calc(n / 2), val(n);
}
默认 rand() \(O(1)\),求其时间复杂度。
点击查看答案
-
\(\Theta(n)\)
-
\(\Theta(n)\)
-
\(\Theta(\log^2 n)\)
-
\(\Theta(\log n)\)
-
运用调和级数知识,\(T(n)=2T(\frac{n}{2})+n\log n\),符合情况 \(3\),时间复杂度 \(\Theta(n\log^2 n)\)

浙公网安备 33010602011771号