zoukankan      html  css  js  c++  java
  • 算法复杂度表示(大O表示法)


    - 概念:
         大O表示法:称一个函数g(n)是O(f(n)),当且仅当存在常数c>0和n0>=1,对一切n>n0均有|g(n)|<=c|f(n)|成立,也称函数g(n)以f(n)为界或者称g(n)囿于f(n)。记作g(n)=O(f(n))。 定义:如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数。T(n)称为这一算法的“时间复杂度”。当输入量n逐渐加大时,时间复杂度的极限情形称为算法的“渐近时间复杂度”。
       即`运行时间`指一种算法的运算时间的增速,并不是以秒为单位的速度。一个算法,并不仅仅要知道他运行的时间,还要知道其随着数据内容的增加他的运算时间是如何增加的。 O(n) 中n是操作的次数。

    - 表示意义
        - 他表示一种算法在最糟糕的情况下需要计算的次数。比如在一个电话簿(n个电话)中找一个电话,利用快速查找,最好的情况是第一次就找到,最坏的情况是第n次找到。这个运行时间要按照最糟糕的情况算  即O(n)
      -我们常用大O表示法表示时间复杂度,注意它是某一个算法的时间复杂度。大O表示只是说有上界,由定义如果f(n)=O(n),那显然成立f(n)=O(n^2),它给你一个上界,但并不是上确界,但人们在表示的时候一般都习惯表示前者。此外,一个问题本身也有它的复杂度,如果某个算法的复杂度到达了这个问题复杂度的下界,那就称这样的算法是最佳算法。

    - 常见的大O运行时间(从快到慢进行排序)
        - O(㏒n)   对数时间  比如二分查找
        - O(n)      线性时间  比如简单查找
        - O(n*㏒n)      比如快速排序
        - O(n²)         比如选择排序
        - O(n!)         比如旅行者问题
     
    复杂度与时间效率的关系:
    c < log2n < n < n*log2n < n2 < n3 < 2n < 3n < n! (c是一个常量)

    - 总结
        - 算法的速度并非指时间,不是以秒为单位;而是操作数的增速。从增量的角度度量的。
        - 平时说的算法的速度,指的是随着输入的增加,其运行时间将会以什么样的速度进行增加。
        - 算法运行时间用大O表示法表示。
        - O(㏒n)比O(n)快。当操作的元素越来,快的越明显。

    - 旅行商问题
        - 内容
            - 一个旅行商要去5个城市,他想选择一个最短的距离,共有5!=120中方法。运行时间为:O(n!) 即操作数(运算的次数)为n的阶层。
  • 相关阅读:
    [转]Putty中文乱码解决方法
    linux内核编译
    grub2的使用
    linux的简单网络配置
    [转]建立swap分区
    [转]ps/2键盘线序识别方法
    Linux下备份系统至另一硬盘
    [转]Vimium快捷键
    [转] C中的位域
    [转]diskpart命令
  • 原文地址:https://www.cnblogs.com/lizhen-home/p/7749704.html
Copyright © 2011-2022 走看看