在具体讲解搜索技术之前,我们先看一个生活中与搜索相关的例子。想象一下,你是国家图书馆的管理员,你管理着几百万本书,要想从这堆书中找到一本你要的书并非易事。实际上当一个人来查找图书时,一般首先定位到某个区域,然后从区域中选择相应书架,最后从书架上找到相关的书。本质上,这个过程也对应了搜索的3个流程:索引(对图书进行编码)、排序(对图书进行排序查找)和检索(对图书进行定位)。
由此可见,恰当地应用索引、排序、检索算法可以更高效地解决搜索问题。
索引体现的是数据存储机制,存储着分词和文档的映射关系。
排序是按照特定的顺序排列和存储内容,以方便后续访问。我们在日常生活中经常运用排序思想,有些是有意识的,有些是无意识的。比如电话本和中英文字典都是按照数字或者字母顺序等方式进行排列的。在搜索技术中,排序为索引的构建进行数据预处理、实现数据分类,这有助于更好和更快地搜索。
检索提供了数据读取和分析的功能,通过对索引使用布尔逻辑运算进行查询,并根据匹配文档的相关性将结果集进行排序,将排名靠前的匹配文档集优先返回给用户。
搜索算法用于检索存储在某类数据结构(字符串、树或者图)中的信息,搜索算法可能采用顺序搜索,也可能不采用顺序搜索。如果数据集中的数据是无序的,就需要使用顺序搜索算法,否则可以使用更高效的二分搜索算法。二分搜索算法遵循分而治之的思想。
对于搜索引擎而言,当用户发起搜索时,搜索引擎使用搜索算法在其已有的内容索引中进行文档检索,然后将匹配的文档根据权重进行排序并返回。搜索引擎的意义是提供用户所搜索的内容。搜索引擎的功能越强大、返回结果越准确,用户使用搜索引擎的频率就越高。
本章介绍应用于字符串、树、图等典型数据结构的搜索算法,并通过算法过程和算法分析介绍各个算法的优缺点和具体使用场景。本章讲解的具体搜索算法如下。
● 字符串搜索:暴力搜索算法、KMP(Knuth-Morris-Pratt)算法、BM(Boyer-Moore)算法等。
● 树搜索:二叉搜索树、2-3-4树、红黑树等。
● 图搜索:广度优先搜索、深度优先搜索等。
此外,本章还讲解与搜索技术息息相关的拓扑排序算法,以及运用上述算法实现的一些应用,例如基于Grep的字符串精确搜索、基于字符串自动补全(Auto-complete)的字符串模糊搜索。