时间复杂度定义
- 在进行算法分析时 ,语旬总的执行次次
T(n)
是关子问题规模n
的函数,进而分析T(n)n
的变化情况并确定T(n)的数量级。 - 一般情况下,随着n的增大,T(n)增长最慢的算法为最优算法
- 算法的时间复杂度也就算法的度量,记作:
T(n)=O(f(n))
.它表示随问题规模n的增大,算法执行时间增长率和f(n)
的增长率相同,乘坐算法的渐进时间复杂度。其中f(n)
是问题规模n的某个函数 - 这样用大写 O()来体现算法时间复杂度的记法,我们称之为大 0 记法 。
- 常见的有常数阶O(1),线性阶O(n),对数阶O(logn),平方阶O(n2)
推导大O阶方法
- 用常熟1取代运行时间中所有的加法常熟
- 在修改后的次数中只保留最高阶项
- 如果最高阶项存在且不是1,则去除与这个项相乘的常数。得到的结果就是大O阶。
常数阶
高斯求和:求1+2+3+4+5+6…+n 结果集
1 |
|
这个算法的运行次数函数是f(n) =3
.根据我们推导大 0 阶的方法,第一步就是
把常数项3改为1在保留最高阶项时发现,它根本没有最高阶项,所以这个算法的O(1).
线性阶
- 线性阶的循环结构会复杂很多。要确定某个算法的阶次,我们常常需要确定某个 特定语句或某个语句集运行的次数。因此,我们要分析算法的复杂度,关键就是要分 析循环结构的运行情况。
1 |
|
它的循环的时间复杂度为 O(n), 因为循环体中的代码须要执行 n 次。
对数阶
1 |
|
- 由于每次count 乘以2之后,就距离n更近了一分 。 也就是说,有多少n个2相乘后大于 ,则会退出循。由 $2^x$=n得到x=log2n。 所以这个循环的时间复杂度为
O(logn)
。 - 二分查找算法的时间复杂度就是O(logn)。O(logn)的意思是以log为底数(你如果采用二分法,那么就会以2为底数,三分法就会以3为底数)比如当数据增大256倍时,耗时只增加8倍:
1 | O(logn)=O(log256) |
O(nlogn)
同理,就是n乘以logn,当数据增大256倍时,耗时增大256*8=2048倍。这个复杂度高于线性低于平方。归并排序就是O(nlogn)的时间复杂度。