渐进时间复杂度分析
1.时间复杂度与渐进时间复杂度
https://blog.csdn.net/mingyuli/article/details/82380107
算法时间复杂度的本质是算法的执行时间,也就是算法中所有语句的频度之和。
当问题规模很大时,精确的计算是很难实现而且也是没有必要的,引入了渐进时间复杂度作为时间性能分析的依据。
渐进时间复杂度可以简称为时间复杂度,记为T(n)=O(f(n))。
2.估计渐进
https://zhuanlan.zhihu.com/p/132396715,这个博文写的不错。
通常,在评估时间复杂度的时候,我们会忽略掉两个部分,一个部分是低阶,另一个部分是常数阶。
- O 渐进符号定义了一个算法的上限,也就是我们说的最坏时间复杂度。例如,插入排序,最佳的情况下的时间复杂度是 O(n),而最坏的情况是 O(n²),所以我们可以说插入排序的事件复杂度是 O(n²)
- Θ 渐进符号表示的是一个算法从上限到下限的时间复杂度。如果使用Θ表示插入排序的事件复杂度,则需要如下:
- 插入排序的最坏时间复杂度为 Θ(n²)
- 插入排序的最佳时间复杂度为 Θ(n)
Ω 渐进符号表示一个算法的下限,也就是我们说的最佳时间复杂度。这个符号使用的最少。
3.以for循环为例说明几种渐进
转自上面知乎专栏
O(1):
int c = 100; for (int i = 1; i <= c; i++){ // 执行 O(1) 的循环体 }
O(n):
for (int i = 0; i < n; i = i+c){ // do O(1) }
O(n^2):
// n 表示用户输入;c 表示常数 for (int i = 1; i <= n; i += c) { for (int k = 1; k <= n; k += c) { // do O(1) } }
O(logn):
// n 表示用户输入;c 表示常数 for (int i = 0; i <= n; i *= c) { // do O(1) }
O(LogLogn):
// n 表示用户输入;c 表示常数 // pow 表示 i^c for (int i = 2; i < n; i = Math.pow(i, c)) { // do O(1) }
O(nLogn):
public void fun(int n) { for (int i = 0; i < n; i++ ){ for (int k = 1; k < n; k = k*2){ // do O(1) } } }
4.常见渐进总结
按数量级递增排列,常见的时间复杂度有:
常数阶O(1)、对数阶O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n2),立方阶O(n3)、k次方阶O(nk)、指数阶O(2n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。
https://www.bilibili.com/read/cv5788376/