大O表示法用来度量一个算法的运行时间。书写为O(n),其中n为一个算法所执行的操作次数。当我们讨论算法的运行时间时,说的是一个算法在给定的输入列表增加的情况下算法执行操作数的增速,也就是运行时间的增速。
二分查找算法
下面介绍两种简单的查找算法说明算法运行时间随输入数的增加的增速。
小明心里随便想了一个1~100之间的数字。
小强的目标是以最快的速度猜出小明想的数字,每次猜完以后小明会说大了、小了或是对了。
算法一:
从第一个数组开始猜,直到猜中为止,则猜测的过程是这样的。
这是简单查找,每次猜测从列表中排除一个数字,直到猜中为止。如果小明想的数字是99,那使用这种算法小强得猜99次才能猜到。
算法二:
小强从列表的中间位置开始猜(也就是50这个数字),小强说出是小了还是大了,此时可以排除一半的数字。从剩余的一半数字中重复上述操作,直到找出小明想的数字。这就是二分查找算法,算法一称为简单查找算法。
通过使用二分查找算法,我们每猜一次就能在原有的数字列表上排除一半的数字。
算法运行时间的增速
在前面的例子中,如果列表有100个数字,使用简单查找我们最多需要猜100次;使用二分查找我们最多需要猜7次就能找到目标数字。假设猜一次所需要的执行时间是1秒,则简单查找需要花费100秒,二分查找仅需要7秒,简单查找所花费的时间相当于二分查找的15倍。
现在假设列表有40亿个数字,在这种情况下使用二分查找需要猜32次,前面我们曾得出结论,简单查找所花费的时间大约是二分查找的15倍,此时你可能会以为在输入列表为40亿的情况先简单查找需要猜32 * 15 = 480次,这是正确的吗?答案是错误的,列表中包含40亿个元素时,按照简单查找,从第一个元素开始最多需要猜40亿次。
为什么会这样呢,因为二分查找和简单查找算法的运行时间的增速不一样,也就是说随着元素的增加,简单查找算法所需的额外时间比二分查找算法所需的额外时间要多。因此,我们知道算法运行完毕所需的时间还不够,还需要知道算法的运行时间是如何随着元素的增加而增长。此时就需要用到大O表示法了。
大O表示法指明算法的运行速度。例如,列表有n个元素,使用简单查找算法最多需要n次查找,用大O表示法这个运行时间表示为O(n)。使用二分查找算法最多需要查找log n次,用大O表示法这个运行时间表示为O(log n)。请注意我们用的是最多,大O表示法表示的是算法在最糟糕的情况下的运行时间。