zoukankan      html  css  js  c++  java
  • 大O记法

      试图摆脱程序或计算机的影响而描述算法的效率时,量化算法的操作或步骤很重要。如果将每一步看成基本计算单位,那么可以将算法的执行时间描述成解决问题所需的步骤数。确定合适的基本计算单位很复杂,也依赖于算法的实现。

      对于累加算法,计算总和所用的赋值语句的数目就是一个很好的基本计算单位。在sumOfN函数中,赋值语句数是1(theSum = 0)加上(theSum = theSum + i的运行次数)。可以将其定义成函数T,令T(n) = 1 + n。参数常被称作问题规模,可以将函数解读为“当问题规模为n时,解决问题所需的时间是T(n),即需要1+n步”。

      在前面给出的累加函数中,用累加次数定义问题规模是合理的。这样一来,就可以说处理前100 000个整数的问题规模比处理前1000个整数的大。鉴于此,前者花的时间要比后者长。接下来的目标就是揭示算法的执行时间如何随问题规模而变化。

      计算机科学家将分析向前推进了一步。精确的步骤数并没有T(n)函数中起决定性作用的部分重要。也就是说,随着问题规模的增长,T(n)函数的某一部分会比其余部分增长得更快。最后比较的其实就是这一起决定性作用的部分。数量级函数描述的就是,当n增长时,T(n)增长最快的部分。数量级(order of magnitude)常被称作大O记法(O指order),记作O(f(n))。它提供了步骤数的一个有用的近似方法。f(n)函数为T(n)函数中起决定性作用的部分提供了简单的表示。

      对于T(n) = 1 + n,随着n越来越大,常数1对最终结果的影响越来越小。如果要给出T(n)的近似值,可以舍去1,直接说执行时间是O(n)。注意,1对于T(n)来说是重要的。但是随着n的增长,没有1也不会太影响近似值。

      再举个例子,假设某算法的步骤数是T(n) = 5n^2 + 27n + 1005。当很小时,比如说1或2,常数1005看起来是这个函数中起决定性作用的部分。然而,随着n增长,n^2变得更重要。实际上,当n很大时,另两项的作用对于最终结果来说就不显著了,因此可以忽略这两项,只关注5n^2。另外,当n变大时,系数5的作用也不显著了。因此可以说,函数T(n)的数量级是f(n) = n^2,或者直接说是O(n^2)。

      累加的例子没有体现的一点是,算法的性能有时不仅依赖于问题规模,还依赖于数据值。对于这种算法,要用最坏情况、最好情况和普通情况来描述性能。最坏情况指的是某一个数据集会让算法的性能极差;另一个数据集可能会让同一个算法的性能极好(最好情况)。大部分情况下,算法的性能介于两个极端之间(普通情况)。计算机科学家要理解这些区别,以免被某个特例误导。

      在学习算法的路上,常见的函数会反复出现,如表2-1所示。要判断哪一个才是的决定性部分,必须了解它们在变大时彼此有多大差别。图2-1展示了表2-1中的各个函数。注意,当较小时,这些函数之间的界限不是很明确,很难看出哪个起主导作用。随着的增长,它们之间的差别就很明显了。

    常见大O函数

     

     
      最后来看一个例子,假设有如代码清单2-5所示的一段Python代码。尽管这个程序没有做什么实际工作,但它对分析性能有一定的指导意义。

    a = 5 
    b = 6 
    n = 10 
    for i in range(n): 
        for j in range(n): 
            x = i * i 
            y = j * j 
            z = i * j 
    for k in range(n): 
        w = a * k + 45 
        v = b * b 
    d = 33

      赋值操作的数量是4项之和:T(n) = 3 + 3n^2 + 2n + 1。第1项是常数3,对应起始部分的3条赋值语句。第2项是3n^2,因为有3条语句要在嵌套循环中重复n^2次。第3项是2n,因为两条语句要循环遍。第4项是常数1,代表最后那条赋值语句。

                    T(n) = 3 + 3n^2 + 2n + 1 = 3n^2 + 2n + 4

      很容易看出来,n^2起主导作用,所以这段代码的时间复杂度是O(n^2)。当变大时,其他项以及主导项的系数都可以忽略。

      图2-2展示了一部分常见的大O函数与前面讨论的T(n)函数的对比情况。注意,T(n)一开始比立方函数大。然而,随着的增长,立方函数很快就超越了T(n)。

     对比T(n)函数与常见的大O函数

  • 相关阅读:
    Flask-wtforms 组件
    flask-session
    [架构漫谈]软件架构师如何工作
    [Python]爬取新型冠状病毒2.2至今的所有数据 python 2020.2.13
    [Python]爬取首都之窗百姓信件网址id python 2020.2.13
    假期学习【十三】信息领域热词分析系统--整体完成
    假期学习【十二】热词分析系统--初步展示
    [Python]python对csv去除重复行 python 2020.2.11
    pip工具下载速度慢的问题
    [Python]pyhon去除txt文件重复行 python 2020.2.10
  • 原文地址:https://www.cnblogs.com/mtfan01/p/14981609.html
Copyright © 2011-2022 走看看