zoukankan      html  css  js  c++  java
  • 什么是好的算法?

    什么是好的算法?

    衡量两个算法谁好谁坏,我们有两个指标。

    • 空间复杂度 (S(n)) —— 根据算法写成的程序在执行时 占用存储单元的长度。这个长度往往与输入数据的规模有关。空间复杂度过高的算法可能导致使用的内存超限,造成程序非正常中断。

    • 时间复杂度 (T(n)) —— 根据算法写成的程序在执行时 耗费时间的长度。这个长度也往往与输入数据的规模有关。时间复杂度过高的低效率算法可能导致我们在有生之年都等不到运行结果。

    空间复杂度 (S(n)),就是 Space。时间复杂度 (T(n)),也就是 Time 的缩写。

    为什么要把它们写成是一个关于 (n) 的函数呢?因为这两个指标其实和我们要处理的数据的规模,是直接相关的。举个例子说:我如果要你打印十个整数,你的程序可能瞬间就给出结果了。如果我让你打印十万个整数呢?你就要多等一会儿了。所以这个程序运行的时间,跟我要你处理的数据是十个还是十万个是相关的。这个“十”或者“十万”,就是我们要处理的数据的规模。我们把它叫做 (n),是一个变量的话,那么我们这个程序所用的时间和空间都跟这个 (n) 是有直接关系的。解决一个问题有很多种不同的方法,你在设计这个方法的时候,一定要把这两个要素考虑清楚。递归如果太长就会爆栈,也就是程序会非正常中断。

    void printN(int N)
    {
        if (N) {
            printN(N-1);
            printf("%d
    ", N);
        }
        return;
    }
    

    递归地调用函数,系统需要把当前这个函数所有的东西和状态都存起来。如果这个函数接收到的参数 (N) 是 100000,那么在内存里头就需要 100000 个这样的函数的内存空间。于是我们就知道,它在内存里面占用的空间的数量实际上和 (N) 成正比,也就是空间复杂度作为一个 (N) 的函数的话,是一个常数乘以 (N)

    [S(n) = C cdot N ]

    前一篇提到的秦九韶的方法为什么要快呢?机器运算加减法的速度比乘除法的速度要快很多,所以我们基本上就是在数函数到底做了多少次乘除法,加减法可以忽略不计。

    在分析一般算法的效率时,我们经常关注下面两种复杂度

    • 最坏情况复杂度 (T_{worst}(n))
    • 平均复杂度 (T_{avg}(n))
  • 相关阅读:
    递归的效率问题以及递归与循环的比较
    malloc/free与new/delete的区别
    类的综合案例——纯虚函数与抽象类( 加强对接口与多态,以及派生类构造函数的理解 )
    对象移动、右值引用详解
    深入理解类成员函数的调用规则(理解成员函数的内存为什么不会反映在sizeof运算符上、类的静态绑定与动态绑定、虚函数表)
    为什么NULL指针也能访问成员函数?(但不能访问成员变量)
    洛谷P1656 炸铁路
    Vijos1901 学姐的钱包
    洛谷P2327 [SCOI2005] 扫雷
    洛谷P1993 小 K 的农场
  • 原文地址:https://www.cnblogs.com/fnmain/p/10803493.html
Copyright © 2011-2022 走看看