算法复杂度

195 阅读2分钟

什么是时间复杂度

用来度量一个算法的运算时间的描述,本质就是一个函数,根据这个函数能粗略的估算出某一情况下,算法运行的时间。

大O表示法

大O符号,又叫做道朗符号,是数学中用另一个较为简单的函数去描述函数渐进行为的一个符号,用来刻画被截断的无穷级数尤其是渐近级数的剩余项。

常见复杂度量级

  • O(1):常量级
  • O(logn):对数级
  • O(n):线性级
  • O(nlogn):线性对数级
  • O(nⁿ):n方阶
  • O(2ⁿ): 指数阶
  • O(n!):n的阶乘

时间复杂度计算

  • 常量阶:只要代码的执行时间不随 n 的增大而增长,这样代码的时间复杂度都记作 O(1)。或者说,一般情况下,只要算法中不存在循环语句、递归语句,即使有成千上万行的代码,其时间复杂度也是Ο(1)。
  • 对数阶:
 i=1;
 while (i <= n)  {
   i = i * 2;
 }

分析上段代码,i的取值是一个首项为1,公差为2的等比数列: 2º·2¹·2²·2³····2ⁿⁿ = n,其中nn即为项数,求对数即 nn=log₂n。时间复杂度为O(log₂n)。

  • 线性阶、n方阶:一般情况下,如果循环体内循环控制变量为线性增长,那么包含该循环的算法的时间复杂度为O(n),线性阶嵌套线性阶的算法时间复杂度为O(nⁿ),涉及下文乘法法则。
  • 线性对数阶:当一个线性阶代码段法嵌套一个对数阶代码段,该算法的时间复杂度为O(nlogn)
  • 指数阶和阶乘阶:根据函数,随着n的增加,运行时间会无限急剧增加,因此效率非常低下。

分析时间复杂度的方法

  1. 最大阶法则,低阶,常数阶忽略。嵌套除外。只看最大阶
  2. 加法法则:总复杂度等于量级最大代码段的复杂度。
  3. 乘法法则:除常数阶外,嵌套代码复杂度等于嵌套内外代码复杂度之积。

空间复杂度

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的一个量度,我们用 S(n) 来定义。