渐进时间复杂度分析

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²)
  • Θ 渐进符号表示的是一个算法从上限到下限的时间复杂度。如果使用Θ表示插入排序的事件复杂度,则需要如下:
      1. 插入排序的最坏时间复杂度为 Θ(n²)
      2. 插入排序的最佳时间复杂度为 Θ(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/

 

posted @ 2020-12-09 22:26  lypbendlf  阅读(1969)  评论(0编辑  收藏  举报