seegongsik
算法

搜索算法 怎么工作

在字典里查词时,不会从第一页一页一页地翻。而是翻到中间,判断要找的词在前面还是后面。只要排好了顺序,像这样一半一半地切下去,就能快得多地找到。

01

从头依次找

最简单的找法,是从头一个个看。
“是这个吗?不是。下一个呢?不是。”一直翻到找到为止。
虽然稳妥,可要找的值在后面的话,就要花很久。

2
5
8
11
13
17
21
25
从前面一格格确认。要找的越在后头,越费时间。

按“逐个查找”,就从前往后一格一格检查。要找的值是13。

格子不多的话,这样也没问题。
可要是有几千、几万个,一个个看就得花上好久。
还有更好的办法,是排好顺序时才能用的聪明办法。

02

翻到中间

排好了顺序,就这样做:先翻到中间看一看。
要找的值比它大,就扔掉前一半;比它小,就扔掉后一半。
每看一次,就去掉一半。

2
5
8
11
13
17
21
25
跟中间的值比,把没有要找的那一半整个扔掉。

每按一次“看中间”,就把不可能有目标值的那一半整个扔掉。要找的值是13。

一次扔掉一半,剩下的就一下子少了。
8格变4格,4格变2格,2格变1格。
看几次,就缩到只剩一格了。

03

逐个 vs 对半

把两种方法并排放着,找同一个值。
逐个找的那一边,要看很多次才能找到后面的值;对半找的那一边,几次就完成了。
答案一样,步数却差得远。

一个个慢
2
5
8
11
13
17
21
25
一半一半快
2
5
8
11
13
17
21
25
一半一半地切,用少得多的步数找到同一个值。

找同一个值(13),比较步数。逐个 = 慢 · 对半 = 快。

格子越多,差距就越大。
一千个东西逐个看,最多要看一千次;对半切,大约十次就够了。
在大数据里,这个差距大得惊人。

04

为什么要先排序

对半切有一个条件:必须排好顺序。
只有排好了,“比中间大就可以扔掉前面”才成立。
要是乱七八糟,就没法扔掉一半。

2
5
8
11
13
17
21
25
队排好了。能以中间为准扔掉一半。
前面排好了队,这里才能快速查找。

只有排好了序,对半切才行得通。排好 → 成立 · 乱七八糟 → 不成立。

所以排序和查找是一对搭档。
一旦排好了队,以后查找就一直很快。
花在整理上的力气,会一次又一次得到回报。

05

一路走到这里

查找总在我们身边。
字典、电话簿、在搜索框里打的一个词,背后都有对半切这样的方法在飞快地找答案。
顺序、排序、查找,现在连成了一条线。

查找 = 把想要的快快拈出来
一个个慢 · 排好就一半一半 · 快得多。
顺序
定好的步骤
排序
排成一列
查找
快快拈出
从下一课开始,我们会更深入一步,学习怎样衡量一个算法有多快。

顺序 → 排序 → 查找,走到了这里。查找 = 快速挑出想要的东西。

现在你应该明白了,算法并不是什么了不起的东西。
定好顺序,整理好,聪明地去找。
小小的巧思聚在一起,就能办成大事。

一句话总结查找就是挑出想要的东西。一个个看很慢,但只要排好了顺序,一半一半地切下去,就能快得多地找到。对半切只有在排好序时才行得通,所以排序和查找是一对搭档;一旦排好了队,以后就一直很快。
← 算法
如果有帮助,请支持我们