zoukankan      html  css  js  c++  java
  • 渐进时间复杂度分析

    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/

  • 相关阅读:
    Servlet的生命周期?
    C++图结构的图结构操作示例
    如何从google play下载app应用,直接下载apk
    C# Socket异步聊天例子
    三极管饱和,放大,截止电压判断
    java中的浮点(float)运算
    微软2014校园招聘笔试试题
    软件开发中的资源控制问题学习
    linux mount命令学习
    17、Spring Boot普通类调用bean【从零开始学Spring Boot】
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/14111357.html
Copyright © 2011-2022 走看看