• 算法复杂度


    一、概念

    算法的效率主要由时间复杂度和空间复杂度来评估

    时间复杂度:评估执行程序所需的时间,可以估算出程序对处理器的使用程度

    空间复杂度:评估执行程序所需的存储空间,可以估算出程序对计算机内存的使用程度

    设计算法时,时间复杂度比空间复杂度更容易出问题,所以一般情况下只对时间复杂度进行研究,一般算法的复杂度就是指时间复杂度

    用O(n)来体现算法时间复杂度的记法被称作大O表示法

    二、推导方法

    1、用常数1取代运行时间中的所有加法常数

    2、只保留最高阶项

    3、去除最高阶的常数

    三、时间复杂度量级示例和比较

    1、常数阶 O(1)

    i = 1, j = 2
    return i + j
    

    语句只执行1次,哈希算法就是典型的O(1)

    2、对数阶 O(logn)

    i = 1
    for(i < n) {
        i = i * 2  
    }
    

    可以看到n不停增加对循环次数的影响较小,小于线性阶,例:二分查找法

    3、线性阶 O(n)

    i = 1
    for(i < n) {
        i = i + 1
    }
    

    循环了n次,时间复杂度随着n的增加线性增加,遍历算法

    4、线性对数阶 O(nlogn)

    j = 1
    for(j < n) {
        i = 1
        for(i < n) {
            i = i * 2
        }
    }
    

    O(n) * O(logn) = O(nlogn),比如当n增大256倍时,时间复杂度为原先的256*8倍,例:归并排序法

    5、平方阶 O(n2)

    i = 1
    for(i < n) {
        i = 1
        for(j < n) {
            O(1)
        }
    }
    

    O(n) * O(n) = O(n2),例:冒泡排序

    6、立方阶 O(n3)

    同理O(n) * O(n) * O(n) = O(n3)

    7、k次方阶 O(nk)

    同理

    8、指数阶 O(2n)

    fun(n) {
        if(n <= 1) {
            return 2;
        } else {
            return fun(n - 1) + fun(n - 2)
        }
    }
    

    几何倍增序列说的就是它,参考国王放米粒的故事,1、2、4、8、16.... 增长下去时间复杂度飙升

    9、阶乘阶 O(n!)

    fun(n) {
        if(n <= 1) {
            return 1
        else {
            return n * fun(n - 1)
        }
    }
    

    1*2*3*4*....*(n-2)*(n-1)*n,比指数阶增长的还快

    10、复杂度比较

    O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(nk) < O(2n) < O(n!)

    四、空间复杂度

    也叫渐进空间复杂度,概念和时间复杂度类似,表示数据规模和存储空间的增长关系

    五、复杂度对比

     

    六、几个链接

    详细的算法可视化分析(可以用浏览器翻译一下):https://bost.ocks.org/mike/algorithms

    常见排序可视化:https://www.cnblogs.com/liululin/p/5897059.html、https://visualgo.net/zh、https://www.ee.ryerson.ca/~courses/coe428/sorting/sorting.html

    jdk1.7从python引入的排序算法Timsort说明:https://www.jianshu.com/p/892ebd063ad9

  • 相关阅读:
    [学习笔记]Java代码中各种类型变量的内存分配机制
    记录一次linux线上服务器被黑事件
    浅谈Facebook的服务器架构(组图)
    make: *** [sapi/cli/php] Error 1 解决办法
    linux CentOS 系统下如何将php和mysql命令加入到环境变量中
    Linux系统安装Apache 2.4.6
    日请求亿级的QQ会员AMS平台PHP7升级实践
    聊一聊淘宝首页和它背后的一套
    PHP与MySQL通讯那点事
    PHP多进程(4) :内部多进程
  • 原文地址:https://www.cnblogs.com/ctxsdhy/p/12613630.html
Copyright © 2020-2023  润新知