简介

对于算法进行分析评估,通常是从时间与空间两种因数进行讨论的.
时间复杂度: 算法执行语句的次数.
空间复杂度: 算法在运行过程中临时占用储存大小的计算量度.

大O表示法(big-oh)

算法的时间复杂度通常用大O表示,一般用于界定函数集合的上界,可以称作渐进上界记号.

数学定义: 设T(n)和g(n)是定义域为自然数集N上的函数.若存在正常量c和n0,使得对一切n≥n0都有0≤T(n)≤cg(n)成立, 则称T(n)的渐进上界是g(n).表达式T[n]=O(g(n)),称为渐进时间复杂度.一般情况下,T[n]为算法基本操作重复执行的次数,g(n)是算法中频度最大的语句频率.

常见的时间复杂度(以算法平均情况归类):

序号 名称 例子 说明
1 常数阶O(1) 哈希算法 hash/普通的加减乘除等语句
2 对数阶O(logcn) 二分查找 / 斐波那契数列 二分策略,底数c一般是2
3 线性阶O(n) 线性查找 循环
4 线性对数阶O(nlogcn) 归并排序 / 快速排序 / 希尔排序 / 堆排序 分治,底数c一般是2
5 平方阶O(n2) 简单插入排序 / 简单选择排序 / 冒泡排序 双层循环,检查所有元素对
6 立方阶O(n3) 全源最短路径 - floyd算法 三层循环,检查所有的三元组
7 k次方阶O(nk) DFS深度优先 发现从源节点可达的所有节点为止
8 指数阶O(2n) 穷举查找 检查所有子集
9 阶乘O(n!) 旅行商问题

其中O(logcn)、Ο(n)、O(nlogcn)、O(n2)、O(n3)和O(nk)称为多项式时间,而O(2n)和Ο(n!)称为指数时间.
计算机科学家普遍认为前者(即多项式时间复杂度的算法)是有效算法,把这类问题称为P(Polynomial,多项式)类问题,而把后者(即指数时间复杂度的算法)称为NP(Non-Deterministic Polynomial,非确定多项式)问题.

//求出1+2+3+4+……+100的和?
//示例1:
int sum = 0;      //执行1次
int n=100;        //执行1次
for (int i =1; i<=n; i++){  //执行n+1次
    sum+=i;      //执行n次
}
//g(n)=1+1+n+1+n=2n+3≈n(当n趋于∞时),故T(n)=O(n);

//示例2:
int sum =0;   //执行一次
int n = 100;  //执行一次
sum = (1+n)*n/2;  //执行一次
//g(n)=3 与n无关的常数阶,故T(n)=O(1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14

大Ω表示法(omega)

Ω也是一种时间复杂度的渐进表示法,一般用于界定函数集合的下界,可以称作渐进下界记号.

数学定义: 设T(n)和g(n)是定义域为自然数集N上的函数.若存在正常量c和n0,使得对一切n≥n0都有0≤cg(n)≤T(n)成立, 则称T(n)的渐进下界是g(n).表达式T[n]=Ω(g(n)).

大Θ表示法(theta)

Θ用于界定函数的渐进上界和渐进下界,可以称作渐进紧确界记号.

数学定义: 设T(n)和g(n)是定义域为自然数集N上的函数.若存在正常量c1、c2和n0,使得对一切n≥n0都有0≤c1g(n)≤cT(n)≤c2g(n)成立, 则称T(n)的渐进紧确界是g(n).表达式T[n]=Θ(g(n)).

小o表示法

由大O记号提供的渐进上界可能是渐进紧确的,也可能是非紧确的,用小o表示一个非渐进紧确的上界

数学定义: 设T(n)和g(n)是定义域为自然数集N上的函数.对任意正常量c>0,存在常量n0>0,使得对一切n≥n0都有0≤T(n)<cg(n)成立, 则称T(n)的非渐进紧确上界是g(n).表达式T[n]=o(g(n))

小w表示法

由大Ω记号提供的渐进下界可能是渐进紧确的,也可能是非紧确的,用小w表示一个非渐进紧确的下界

数学定义: 设T(n)和g(n)是定义域为自然数集N上的函数.对任意正常量c>0,存在常量n0>0,使得对一切n≥n0都有0≤cg(n)<T(n)成立, 则称T(n)的非渐进紧确下界是g(n).表达式T[n]=w(g(n))

上次更新: 2019-6-24 19:17:56