• 算法复杂度分析


    推到大O阶方法:

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

    2.在修改后的运行次数函数中,只保留最高阶项。

    3.如果最高阶项存在且不是1,则去除与这个项相乘的常数。

    得到的结果就是大O阶。

    常数阶

    如果没有循环和递归语句,只是单纯的顺序结构,那么算法复杂度为O(1)。

    对于分支分支结构来说,无论真假,执行的次数都是恒定的,不会随n的改变而发生变化,所以单纯的分支结构,其时间复杂度也是O(1)。

    线性阶

    线性阶的循环结构复杂一些,如:

    int sum = 0;            //1

    for(int i = 1 ; i <= 100 ; i++)  //n+1

    {

      sum+= i;          //n

    }

    printf("%d",sum);         //1

    该算法共执行了2n+3次,

    所以算法复杂度为O(n)

    对数阶

    int count = 1;

    while(count < n)

    {

      count = count * 2

    }

    结果为2^x >= n

    则x = log2n

    所以复杂度为O(logn)

    平方阶

    int i,j;

    for(i = 0 ; i < n ;i++)

    {

      for(j = 0 ; j < n ;j++)

      {

        ....

      }

    }

    则时间复杂度为O(n^2);

    如果内外层的循环次数不一样,那么复杂度就为O(mxn)

    常见的时间复杂度

    执行次数函数 非正式术语
    12 O(1) 常数阶
    2n+3 O(n) 线性阶
    3n^2+2n+1 O(n^2) 平方阶
    5log2n+20 O(logn) 对数阶
    2n+3nlog2n+19 O(nlogn) nlogn阶
    6n^3+2n^2+3n+4 O(n^3) 立方阶
    2^n O(2^N) 指数阶

    常用的时间复杂度所消耗的时间从小到大排序

    O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)

    对于指数级以上的算法基本是无效的不可计算的。

    最坏运行时间

    最坏运行时间就是该算法在条件下所要运行的最长时间情况,一般说算法复杂度都指的是最坏时间复杂度。

    算法控件复杂度

    算法的空间复杂度通过计算算法所需要的存储空间实现,算法空间复杂度的计算公式记做:S(n) = O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储控件的函数。

    指令,常数,变量和输入数据和算法本身没有关系,所以只需要计算算法额外需要的辅助空间就可以。

  • 相关阅读:
    一本通1018
    并查集&MST
    hdu 1875 畅通工程再续
    hdu 1811 Rank of Tetris(拓扑排序+并查集)
    hdu 1325 is it a tree?
    hdu1285拓扑排序
    hdu2063 过山车(最大二分匹配)
    最小生成树二·Kruscal算法
    hiho一下 第二十一周(线段树 离散化)
    hiho一下 第二十周(线段树模板)
  • 原文地址:https://www.cnblogs.com/madpanda/p/4640576.html
Copyright © 2020-2023  润新知