zoukankan      html  css  js  c++  java
  • 时间复杂度的理解

    『 O(某函数())』用来描述一个算法处理给定的数据大概需要多少次运算。

      - 大O符号是一种算法复杂度的相对表示方式。

      这句话中有三个重要的用词,只要理解它们,就能知道它到底是什么意思了:

        1、相对(relative):你只能比较相同的事物。你不能把一个做算数乘法的算法和排序整数列表的算法进行比较。

          就好比拳击比赛需要分重量级进行比赛一样,这样的比较是没有意义的。

        2、表示(representation):大O(用它最简单的形式)把算法间的比较简化为了一个单一变量。这个变量的选择基

          于观察或假设。例如,处理某一个问题,有三种算法可以解决,它们的时间复杂度分别是O(n),O(logn),O(n2),

          这样就能很快比较出这三种算法的优劣了。而里面的变量是多少,取决于算法是什么样的模式,它们在运算过程中

          做了什么样的操作。

        3、复杂度(complexity):如果排序10,000个元素花费了我1秒,那么排序1百万个元素会花多少时间?

          在这个例子里,复杂度就是相对其他东西的度量结果。

      - 算术可以让我们更好的理解大O:

        这里我们可以联系小学学的竖式运算来理解:

        1)当我们进行加法运算时,我们需要对每一位上的数做一遍加法,所以,当我们进行2个4位数的加法时,就需要算4次,

          如若进位,就需要多算一次,100位数相加就需要做100次运算,以此类推;减法的模式和加法类似,只是借位替代了进位;

        2)我们在做乘法运算时,需要将每1位数字与另一个数字的每1位相乘,再做加法,所以两个n位数想乘,就要

          先做n2次乘法,再做大概2n次加法来得到最终结果。

        - 上面的两个例子都是用来解决两个数字的运算问题的,但它们的模式不一样,经历的过程不一样,所以复杂度就不一样,

        加法的模式中,位数和运算操作是成正比的,所以它的时间复杂度可以用O(n)表示;

        而乘法的模式中,它是以平方的方式进行增长,它的时间复杂度可以用O(n2+2n)表示。

        我们只关心复杂度最重要的部分:乘法运算中,我们可以把操作次数表示为:n2 + 2n。但当n特别大时,第二个 2n 就无关紧要。

        所以只需要用O(n2)就能表示乘法运算的时间复杂度

  • 相关阅读:
    Java vs Python
    Compiled Language vs Scripting Language
    445. Add Two Numbers II
    213. House Robber II
    198. House Robber
    276. Paint Fence
    77. Combinations
    54. Spiral Matrix
    82. Remove Duplicates from Sorted List II
    80. Remove Duplicates from Sorted Array II
  • 原文地址:https://www.cnblogs.com/value-code/p/8506340.html
Copyright © 2011-2022 走看看