将焦点集中在解决问题方法中那些能独立于具体实现的属性,希望能排除那些细节干扰,区分出核心问题所在。
渐近记法核心思想是想提供一种资源表示形式,主要用于分析某项功能在应对一定规模参数输入时所需要的资源(通常指的是时间,但有时候也包括内存)。
渐近记法使用的是一组由希腊字母构成的记号体系。这之中最重要的记号分别是O(omicron)
、Ω(omega)
、θ(theta)
。其中,O记号的定义可以被当作其他两个符号的基础。
表达式O(g)
代表的是一组与某个函数g(n)有关的函数集合。若要让某函数f(n)属于该集合,该函数须满足以下关系:
存在自然数n0和正数c,对于所有的n>=n0都有: f(n) <= c*g(n)
而另外两种记法Ω与θ则可以被视为O记法的变体。其中,Ω的定义正好与之相反。也就是说,若要让函数f(n)属于Ω(g),该函数须满足以下关系:
存在自然数n0和正数c,对于所有的n>=n0都有: f(n) >= c*g(n)
因此,O记法所代表的其实是所谓的渐近上界,而Ω记法所代表的则是渐近下界。
而θ记法所代表的集合正好是前面两种记号的交集,即θ(g) = O(g) ∩ Ω(g)
。换句话说,若要让某个函数属于θ(g),该函数须满足以下关系:
存在自然数n0和正数c,对于所有的n>=n0都有: c1*g(n) <= f(n) <= c2*g(n)
渐近运行时间
几种常见的渐近运行时间实例
时间复杂度 | 相关名称 | 相关示例及说明 |
---|---|---|
θ(1) | 常数级 | 哈希表的查询与修改 |
θ(lg n) | 对数级 | 二分搜索 |
θ(n) | 线性级 | 列表的遍历 |
θ(n lg n) | 线性对数级 | 任意值序列的最优化排序,其复杂度等同θ(lg n!) |
θ(n²) | 平方级 | 拿n个对象进行相互比对 |
θ(n³) | 立方级 | Floyd-Warshall算法 |
O(n^k) | 多项式级 | 基于n的k层嵌套循环,且必须满足常数k>0 |
Ω(k^n) | 指数级 | 每n项产生一个子集(其中k=2),且必须满足k>1 |
θ(n!) | 阶乘级 | 对n个值执行全排列操作 |
(最近更新:2019年05月22日)