大O符号与时间复杂度

大O符号

1. 定义

大O符号(Big O notation)是用于描述函数渐进行为的数学符号。

也可以这么说:

用一个大O,在其括号()中,用另一个函数来描述原来的函数的数量级渐进上界

计算机科学中,用于分析算法复杂性非常有用

2. 使用

这个符号有两种形式上很接近但迥然不同的使用方法:无穷大渐近与无穷小渐近。然而这个区别只是在运用中的而不是原则上的——除了对函数自变量的一些不同的限定, “大O”的形式定义在两种情况下都是相同的

分析算法复杂度时,用的O都代表无穷大渐进,表示n趋近于无穷大的情况

2.1 无穷大渐进

举例如下:

假设,解决一个规模为n的问题所花费的时间(或者所需步骤)可以表示为:

T(n) = 4n2 - 2n + 2

当n越来越增大时,n2项将开始占主导地位,而其它各项可以被忽略(自然包括2)

例如:当n=500时,4n2 项是2n项的1000倍大,因此在大多数非精确场合下,省略2n项对表达式值得影响是可以忽略不计的

其实进一步看,与n2的指数相比其系数4(与指数增大相比系数是很小的)也是无关紧要的

这样,大O符号就记下剩余的部分,写作:
T(n)∈O(n2)

或者更常见的

T(n)=O(n2)

此时,我们就说该算法具有n2阶(平方阶)的时间复杂度

2.2 无穷小渐进

暂不描述

3. 常用函数阶

下表是在分析算法时常见的函数。这些函数都处于n趋近于无穷大的情况下,在这种情况下函数结果值增长的慢的在表上方。c是一个任意常数,重点是n

符号 名称(后面都要+个“阶”)
O(1) 常数
O(log n) 对数,情况最多的底数为2(但也可能为其它),但是底数无关紧要,所以不明确说底数
O[(long n)c] 多对数
O(n) 线性
O(n log* n) log* n为迭代对数
O(n log n) 线性对数
O(n2) 平方
O(nc),Interger(c>1) 多项式,有时叫“代数”
O(cn) 指数,有时叫“几何”
O(n!) 阶乘,有时叫“组合”

时间复杂度

时间复杂度的分析基本就是上边2.1,这里想说的是关于时间复杂的一些让我混淆的概念

  1. 最坏时间复杂度

    一般来说,我们希望获得一个算法的时间效率下限。这就是所谓最坏时间复杂度,它是一个保证

  2. 平均时间复杂度

    不过通常来说,我们碰到的问题情况应该是既不是最坏的也不是最好的,所以算下来是平均情况居多

    但是,平均情况经常不可能准确得到,所以通常它是指的一种数学期望值

  3. 最好时间复杂度

    最好的情况就是待处理数据就是我们想要的数据形式,那么此时时间复杂度为:O(1),但这没什么意义
    我并不是说最好时间复杂度是O(1),可能是吧,但是一般认为:考虑最好情况下的复杂度没有意义

结论

  1. 一般来说,当我们说“时间复杂度”时,一般指的是平均时间复杂的

  2. 如果明确说“最坏”、“平均”或者“最好”那么就没有异议

你可能感兴趣的:(算法,时间复杂度,o,大O)