大O

表示时间的大O符号,是用来描述算法效率的语言和度量单位。不完全理解这个概念,不只会影响你作出清晰的判断,还会让你没法评价算法的优劣。算法

  • 常量不算在运算时间里。

例如某个O(2N)的算法其实是O(N)。特定输入中,O(N)颇有可能会比O(1)代码还要快。大O仅仅描述了增加的趋势。数组

  • 丢弃不重要的项

应该舍弃可有可无的项。好比 O(N2+N)变成O(N2)、O(N+logN)变成O(N)、O(5*2^N+1000N^100)变成O(2^N)等。函数

  •  logN运行时间

元素的个数每次减半,它的运行时间极可能是O(logN)。spa

以二分查找为例。假设一个排序数组长度为N,目标值为x。首先比较x与中值,若是x等于中值直接返回,若是小于中值,搜索数组的左边,若是大于中值,搜索数组的右边。code

开始时有N个元素的排序数组要搜索,通过一次搜索以后,还剩下N/2个元素,再一次,剩下N/4个元素,直到找到目标值或者待搜索元素个数为1时才中止搜索。blog

同理,在平衡二叉搜索树中查找一个元素也是O(logN),每次比较,非左即右。排序

  • 递归的运行时间

当一个屡次调用本身的递归函数出现时,它的运行时间每每是O(分支数^数的深度),分支数即每次调用本身的次数。递归

例如:class

int f(int n) {
  if (n <= 1) {
    return 1;
  }
  return f(n-1) + f(n-1);
}

运行时间是O(2^N)。效率

这个例子的空间复杂度为O(N),尽管树节点总数为O(2^N),但同一时刻只有O(N)个节点存在。

再例如:

把平衡二叉搜索树上全部节点的值相加,运行时间是多少?

分支树是2,深度大概是logN,因此为O(2^logN) = O(N) , 运行时间是O(N)。

相关文章
相关标签/搜索