• 时间复杂度和空间复杂度


    1.一些概念

    时间复杂度和空间复杂度一般是针对算法而言,是衡量一个算法效率的重要标准。虽然计算机能快速的完成运算处理,但实际上,它也需要根据输入数据的大小和算法效率来消耗一定的处理器资源。要想编写出能高效运行的程序,我们就需要考虑到算法的效率。

    算法的效率主要由以下两个复杂度来评估:
    时间复杂度:评估执行程序所需的时间。可以估算出程序对处理器的使用程度。
    空间复杂度:评估执行程序所需的存储空间。可以估算出程序对计算机内存的使用程度。

    理解误区:

    • 时间复杂度并不是算法执行的时间。
    • 算法不单单指冒泡排序之类的,一个循环甚至是一个判断都可以称之为算法。

    2.时间复杂度

    可看此篇博客  一套图 搞懂“时间复杂度”,可更好的理解时间复杂度。

    时间复杂度指算法语句的执行次数。一个算法语句的执行次数最终都是可以通过函数f(n)来表示的。举例讲解:

    int aFunc(void) {
        printf("Hello, World!
    ");      //  需要执行 1 次
        return 0;       // 需要执行 1 次
    }

    f(n)=1+1=2

    int aFunc(int n) {
        for(int i = 0; i<n; i++) {        
            printf("Hello, World!
    ");      // 需要执行 n 次
        }
        return 0;       // 需要执行 1 次
    }

     f(n)= n + 1 

    for(int i = 0;i < n;i++){       //需要执行n次算法
        for(int j = 0;j < n;j++){
            System.out.println("-");   //需要执行n次算法
        }
    }

     f(n)=n*n=n^2

    理解了如何将算法语句执行次数通过函数表示出来,时间复杂度一眼就看出来了,有以下几条规则

    1.选取f(n)系数最大的项,如果系数都是负数,就选常数,那么时间复杂度是常数阶O(1)

    2.根据第一条拿到系数最大项后,将系数化为1,剩下的就是时间复杂度

    3.一个算法可能有多条算法语句,即可能有多个循环判断,时间复杂度的计算考虑最坏情况,即取最大的。

    根据以上3个规则,前面三个例子的时间复杂度分别为:

              O(1)  O(n)  O(n^2)

     3.空间复杂度

    空间复杂度就是一个算法在运行过程中临时占用的存储空间大小,换句话说就是被创建次数最多的变量,它被创建了多少次,那么这个算法的空间复杂度就是多少。举例讲解:

    for(int i=0;i<n;++){
    int temp = i;      //temp 需要创建n次
    }
    和
    int temp=0;       //temp 创建1次
    for(int i=0;i<n;i++){
    temp = i;        
    }

    前者空间复杂度就是O(n),而后者空间复杂度就是O(1)常数阶。很好理解,前者每循环一次都会重新创建一个temp对象,而后者只在循环外面创建了一个temp对象,每次循环只是给他不同的引用而已。所以有个规律,如果算法语句中就有创建对象,那么这个算法的时间复杂度和空间复杂度一般一致,很好理解,算法语句被执行了多少次就创建了多少对象。

    抄录博客

    1.永远不背时间复杂度和空间复杂度

  • 相关阅读:
    网络编程之即时通信程序(聊天室)(一)通信流程简介及通信协议定制
    C#常用加密方法解析
    ASP.NET常用数据绑定控件优劣总结
    使用XPO开发时可以参考使用的架构
    渠道会上的体会
    如何利用第三方SDK开发MSN机器人以及实现语音视频?
    对 XPO 的一些问题的解答
    c++ 参数传递 之引用形参 GIS
    指针与引用的区别 GIS
    c++ const 修饰数组 GIS
  • 原文地址:https://www.cnblogs.com/chensisi/p/13267177.html
Copyright © 2020-2023  润新知