算法的基础
一、二分查找:
假如我们来玩一个猜数的游戏,随便想一个1~100的数字,最多需要几次能猜对呢?
傻找:什么是傻找呢,就是从1开始往上猜,如果想的数是99,岂不是要猜99次,你不傻谁傻?
最佳的方案:如果我说50,你说猜小了,哇咔咔我们一下子就排除了50个数,再接下来知道怎么猜了把,当然是75啦,即每次猜的数都是余下数的一半,如此下去,不管你想的数是多少,我都能在7次之内猜出来,这就是大名鼎鼎的二分查找法。
注意:二分查找法只适用于有序的列表。
一般而言,对于包含n个元素的列表,用二分查找法最多需要log2的n步,而简单查最多需要n步。
对数:
算法的世界里,怎么可能少得了数字,那什么叫对数呢?
如果a的x次方等于N(a>0,且a不等于1),那么数x就叫做以a为底N的对数,记作x=loga(N),其中a为底数,N为真数。例子:2的3次方等于8,那么3就是以2为底8的对数。
二、运行时间:
线性时间,简单查找(逐个检查)列表中的元素,换言之,最多需要猜测的次数(之前的猜数)与列表长度相同,这被称为线性时间。
对数时间,以二分查找运行的时间称为对数时间(log时间,log指log2,2为底数)。
三、大O表示法
大O表示法为一种特殊的表示法,指出了算法的速度有多块。
举例:如果说检查一个元素需要1毫秒。使用简单查找时,需要100毫秒(猜数游戏为例),那么二分查找大约需要(log2的100)7毫秒;由此可以得出简单查找所需的时间大约是二分查找的15倍;如果一个序列中包含10亿个元素,二分查找需要约30毫秒,那么简单查找所需要的时间为30*15=450毫秒,结果真的是这样吗?
其实不是,而且是大错特错!!!
简单查找与二分查找运行时间的增速不同,什么意思呢?
也就是说,随着元素数量的增多,二分查找需要的额外时间并不多,而简单查找需要的额外时间却很多。因此,随着列表的增长,二分查找的速度比简单查找快得多。
有签于此,仅知道算法需要多长时间才能郧西那个完毕还不够,还需要知道郧西那个时间如何随着列表增长而增大,这正是大O表示法的意义所在。
大O表示法指出了算法有多块。例如,建设列表包含n个元素,简单查找需要检查每个元素,需要执行n次,使用大O表示法,这个时间为O(n),单位秒?没有--大O表示法指的并非以秒为单位的速度,而是让你比较操作数,它指出了算法运行时间的增速。
二分查找法大O表示法为O(logn,注意此处log为简写,实际为log2的n次方)。
注意:大O表示法指出的永远都是最糟糕情况下的运行时间。
一些常见的大O运行时间:
O(log n),对数时间,这样的算法包括二分查找;
O(n),线性时间,这样的算法博爱阔简单查找;
O(n * log n),快速排序,一种速度较快的排序算法;
O(n的2次方),选择排序,一种速度较慢的排序算法;
O(n!),旅行商解决方案,一种非常慢的算法。
总结:
算法的速度指的并非时间,而是操作数的增速;
二分查找的速度比简单查找快得多;
O(log n)比O(n)快。需要搜索的元素越多,前者比后者就快得越多;
算法运行时间是从其增速的角度度量的;
算法运行时间使用大O表示法表示。