学习笔记——算法图解(1)

245 阅读4分钟

今天开始学习的是一个pdf书籍——《算法图解 像小说一样有趣的算法入门书》

这本书就如他书名所写一样,适合入门的一本算法书,只需要懂得一点基础便可以学习里面的基础入门算法,图解配合里面的漫画,让人通俗易懂,将生涩的知识更加以通俗的方式讲解出来。话不多说,接下来我们开始介绍这本书。

目录是长这样的

接下来我们来介绍一下书中第一章的内容:算法简介

所谓算法,指的就是一组完成任务的指令,任何的代码片段都可以称之为算法。说到这里,大家是否会很疑惑,我们平时写的都是算法,那我们学的算法又是什么呢?其实,我们平常想学的算法,是更为复杂的代码。而本书所介绍的算法要么是速度快,要么能解决有趣的问题,接下来我们就开始接触算法吧!

一、二分查找

二分查找有一个使用前提,输入必须是一个有序的元素列表。二分查找有什么好处呢?比如一个数组(电话本)里面有300个元素,我需要查找名字是k开头的人的电话号码,如果用传统的遍历方式的话,需要从第一个元素进行遍历,直到找到目标才算结束,假设k位于第201位,则需要遍历201次才找到目标。

而使用二分查找的话,

我们截取数组的一半(150)所处的这个人的名字开头字母,与目标人物的进行比较,发现目标不在150范围内;

从另外的一半数组中再截取一半(225)进行比较,确定目标在151-225范围内;

从151-225的数组中截取一半(188)进行比较,确定目标在188-225范围内;

从188-225的数组中截取一半(207)进行比较,确定目标在188-207范围内;

从188-207的数组中截取一半(198)进行比较,确定目标在198-207范围内;

从198-207的数组中截取一半(204)进行比较,确定目标在198-204范围内;

从198-204的数组中截取一半(201)进行比较,确定目标在198-201范围内;

从198-201的数组中截取一半(200)进行比较,确定目标在200-201范围内;

最后一次比较,找到目标索引(201)。

在此次查找中,我们只用了9次就找到了目标的电话号码,相比与普通遍历的201次还是看得出二分查找的优势的。通过这个例子,我们也可以知道,二分查找就是不断的在找数组中间位置的数,从而判断目标在不在这个范围之内从而达到快速找到目标的效果。

二、大O表示法

大O表示法指出了算法的速度有多快,像上述的例子当中假设每检查一次元素需要1毫秒,被检查的目标元素位于300,用普通遍历查找的方式需要查找300次才能得到结果,也就是需要300毫秒,二分查找的方式需要9次,也就是9毫秒。普通的遍历方法查找的运行时间为O(n),用二分查找的方法运行时间为O(log n)。当然了,大O表示法只是描述了算法运行时间的增速,还是一样的例子假设将目标人物定位1,用O(n),只需要执行一次就能找到了,但是他的运行时间也总是O(n),因为大O表示法说的是最糟糕的情形,所以在最糟糕的情况下,需要查找数组中的每一项,对应的运行时间就是O(n)。

经常遇到的5种大O运行时间:

O(log n),也叫对数时间,例:二分查找;

O(n),也叫线性时间,例:简单查找(遍历);

O(n*(log n)),例:快速排序;

O(n^2),例:选择排序;

O(n!),例:旅行商问题;