『 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)就能表示乘法运算的时间复杂度