大 O 符号:又称为渐进符号,是用于描述函数渐近行为的数学符号。在数学中,它一般用来刻画被截断的无穷级数尤其是渐近级数的剩余项;在计算机科学中,它在分析算法复杂性的方面非常有用。

紧确界记号 Θ

  • 记法:f(n)=Θ(g(n))
  • 解释:f 的紧确界为 g
  • 形式化定义:k1>0k2>0n0n>n0:k1g(n)f(n)k2g(n)

在算法分析中,代表算法运行时间的确界。如 Θ(n2) 代表算法运行时间的渐近增长速度和 n2 一样快。

渐进上界记号 O

  • 记法:f(n)=O(g(n))
  • 解释:f 的渐近上界为 g
  • 形式化定义:k>0n0n>n0:|f(n)|kg(n)

在算法分析中,代表算法运行时间的上界,也就是最坏情况下的时间复杂度。如 O(n2) 代表算法运行时间的渐近增长速度不会超过 n2.

非渐近紧确上界记号 o

  • 记法:f(n)=o(g(n))
  • 解释:f 的渐近由 g 主导
  • 形式化定义:k>0n0n>n0:|f(n)|<kg(n)

O 记号提供的渐近上界可以是渐近紧确的,也可以是非渐近紧确的;o 记号提供的只能是非渐近紧确的。

渐近紧确:fg 同阶,如 n2+n=O(n2)

非渐近紧确:f 低于 g 的阶,如 n2+n=o(n3)

渐进下界记号 Ω

  • 记法:f(n)=Ω(g(n))
  • 解释:f 的渐近下界为 g
  • 形式化定义:k>0n0n>n0:f(n)kg(n)

在算法分析中,代表算法运行时间的下界,也就是最好情况下的时间复杂度。如 Ω(n2) 代表算法运行时间的渐近增长速度不会低于 n2.

非渐近紧确下界记号 ω

  • 记法:f(n)=ω(g(n))
  • 解释:f 主导 g 的渐近
  • 形式化定义:k>0n0n>n0:|f(n)|>kg(n)

Ω 记号提供的渐近下界可以是渐近紧确的,也可以是非渐近紧确的;ω 记号提供的只能是非渐近紧确的。

渐近紧确:fg 同阶,如 n2+n=Ω(n2)

非渐近紧确:f 高于 g 的阶,如 n2+n=ω(n)

几种记号的总结

记号意义理解方式
o非渐近紧确上界< 类似
O渐近上界 类似
Θ紧确界 类似
Ω渐近下界 类似
ω非渐近紧确下界> 类似

维恩图表示:

由数据范围反推算法复杂度以及算法内容——yxc

一般 ACM 或者笔试题的时间限制是 1 秒或 2 秒。
在这种情况下,C++ 代码中的操作次数控制在 107108 为最佳。

下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择:

数据范围算法复杂度算法内容
n30指数级别DFS + 剪枝、状态压缩 DP
n102O(n3)Floyd、DP、高斯消元
n103O(n2), O(n2logn)DP、二分、朴素版 Dijkstra、朴素版 Prim、Bellman-Ford
n104O(nn)块状链表、分块、莫队
n105O(nlogn)各种 sort、线段树、树状数组、(STL)set/map、堆、拓扑排序、Dijkstra + 堆、Prim + 堆、Kruskal、SPFA、求凸包、求半平面交、二分、CDQ 分治、整体二分、后缀数组、树链剖分、动态树
n106O(n), 低常数 O(nlogn)单调队列、 哈希、双指针扫描、并查集、KMP、AC 自动机;sort、树状数组、堆、Dijkstra、SPFA
n107O(n)双指针扫描、KMP、AC 自动机、线性筛素数
n109O(n)判断质数
n1018O(logn)最大公约数、快速幂、数位 DP
n101000O(log2n)高精度加减乘除
n10100000O(lognloglogn) n表示位数高精度加减、FFT/NTT