本章目录:
1.什么是算法?
2.便捷的查找方法——二分查找
3.运行时间
4.大O表示法
1.什么是算法?
简单说来,算法就是用来解决实际问题的方法。而在编程世界中,任何代码片段都可以看作是算法。算法的种类复杂多样,在这里我们要谈的,是那些速度快,或者能解决问题,或者兼而有之的算法。
在学习这些算法的同时,我们要分析这种算法的优缺点,为以后的学习打好基础。
2.便捷的查找方法——二分查找
我们肯定都玩过猜数游戏。这个游戏的规则是让对方从1~100随机选一个数,你来猜这个数。当你猜了一个数字之后,对方只能告诉你大了或者小了,或者对了。
有的人运气好一下子就猜出来了。
有的人一个一个的猜,猜了100次,终于猜了出来。
有没有一种更简洁的方法?
我们试试从中间开始猜,也就是从50开始猜。那么当50大了或者小了,有一半的区域会被切除。我们再将剩下一半的区域再取中间,也就是75或者是25,这样循环往复。
直到最后一个数字,我们会发现,就算我们运气再差,整个过程我们也一共只猜了七次。
也就是说,直到我们猜中结果最多需要七次。相比之前的一个一个猜的方法,少了九十多次。
这两种都是算法,我们称之为简单查找和二分查找。毫无疑问,二分查找更省时间。当所处理的数据更多的时候,这种优势会更明显的被显现出来。
那么,这其中有什么规律?
3.运行时间
一般而言,在程序设计过程中,应该选择效率最高的算法以最大程度减少内存的消耗和占用的空间。
回到前面的二分查找中,我们发现,在100个数中查找一个数最多需要7次,经由计算我们发现,在两个数中,查找一个数最多需要一次;四个数需要两次;八个树需要三次;由此我们可以得出一个结论,如果我们要从n个数中使用二分查找寻找一个数,那么我们最多需要logn次。
(这里的logn是以2为底n的对数。)
如果使用简单查找,最多需要查找的次数与数据量相同,我们称之为线性时间;而使用二分查找,需要查找次数是logn次,我们称之为对数时间。
4.大O表示法
在实际运用中,我们使用大O表示法,来表示算法的运行速度。例如前面的例子中,如果我们使用简单查找,那么他的运行时间为O(n)。有人就问,既然是速度,那么他单位是什么?
实际上,大O表示法并不是以时间为单位的速度,他能够让你通过对比括号里的操作数,来比较两个算法增速的不同。
如果我们用大O表示法来表示前面的游戏,那么简单查找的运行时间为O(n),二分查找的运行时间为O(n)。
但是,有的人运气极佳,他用简单查找,第一次就找到了这个数字,那么是不是O(1)?
这里注意,大O表示法指出的是最糟糕情况下的运行时间。你不可能每次运气都这么好,所以我们要做最坏的打算。这是一个保证,保证你的算法运行时间不会超过O(n)。
接下来我们可以列举一下集中比较常见的大O运行时间;
O(logn),对数时间,例如二分查找;
O(n),线性时间,例如简单查找;
O(nlogn),例如快速排序。
O(nn),例如选择排序。
O(n!),例如旅行商问题,非常慢。
这几种运行时间从上到下依次变慢,且随着数据量增大越来越明显。
接下来介绍旅行商问题(非常慢的算法)。
有一个商人,要经过五个城市。他想寻找一种最简单的路径,因此他必须考虑各种顺序。对于每种顺序都进行计算操作,那么5个城市一共需要120次操作,涉及6个城市则需要720次操作,涉及n个城市则需要n!次操作。
可对于这个复杂的问题,还没有更简便的运算方法。
总结一下;
1.二分查找要比简单查找快的多。
2.O(logn)要比O(n)快,需要搜索的元素越多,前者比后者就快的越多。
3.算法运行时间并不以秒为单位。
4.算法运行时间是从其增速的角度度量的。
5.算法的运行时间用大O表示法表示。