用程序员的角度科普生活知识

hello 兄弟们

我是浩说

今天研究个什么事儿呢?

咱就是说:我们在浏览器或者app里搜索的时候

为什么我只输入了一两个字,下面就已经给我罗列出来我想搜的具体内容了

app里的"搜索提示"是如何实现的?

"搜索"就是"问问题"

其实"搜索"对应现实场景就是"问问题"

这个过程就像是:

我问你:"炸鸡哪家比较好吃?"

你的大脑可能是这样的思考过程:

首先从这句话中提取出两个关键词:炸鸡、好吃

接着将你去过的炸鸡店在脑子里列出来

app里的"搜索提示"是如何实现的?

然后根据"好吃"这个关键词将炸鸡店列表重新排序排序

app里的"搜索提示"是如何实现的?

这样你就得到了答案,于是将排序前几名的店跟我一顿推荐,

顺便还向我甩了一句"怎么老铁想请我吃一顿啊?!"

app里的"搜索提示"是如何实现的?

其实大脑的思考过程和app的思考逻辑是一样的,

我们来具体探寻一下!

关键词

我们每个人使用app时的搜索需求都是不同的,比如购物app,每个人想买的东西都不一样,

这个时候app会定时统计每个用户发送过的搜索内容并生成一个"关键词库":

app里的"搜索提示"是如何实现的?

列出来

年底将至,我们就以"年货"这个关键词为例,当我们在购物app里输入"年货"这个词的时候,

app就会从"关键词库"中将与之相关的词筛选出来:

app里的"搜索提示"是如何实现的?

然后再将这些关键词列出来,我们所看到的关键词通常是"列表"的形式,像这样:

app里的"搜索提示"是如何实现的?

但这是经过app处理之后的表现形式,对于app来说,关键词最初是以""的形式列出来的:

app里的"搜索提示"是如何实现的?

在编程语言里,这种数据结构叫做:

Trie 树 (字典树)

Trie 树 (字典树)

为什么要用这种结构呢?

我们对比"列表"和“Trie 树”来看一下:

app里的"搜索提示"是如何实现的?

相比于"列表",Trie 树的优点在于:通过使用公共字符前缀的方式来节省存储空间。

而"搜索"这种场景不就是根据公共前缀来匹配关键词集合吗,那使用Trie 树就再适合不过了!

排序

经过上一步"列出来"之后,由于数据过多,app还需要将数据重新排序,并选择排名靠前的数据作为最后的"搜索提示"结果来展示给用户。

至于app是如何"排序"的,这里面的内容就比较复杂了,涉及到一些公式化的算法,想要探讨的话一定是长篇大论且枯燥乏味。

你可以简单的这样理解:按照关键词的搜索频率排序,频率越高越靠前:

app里的"搜索提示"是如何实现的?

排好序之后靠前的数据就是我们最终看到的"搜索提示"啦!某宝是展示了前十个:

app里的"搜索提示"是如何实现的?

今天我们探讨了"搜索提示"功能的实现原理

并借此了解了Java的数据结构:Trie 树

以及 Trie 树 的特点、适用场景听说点赞分享的人虎年都能行大运发大财呢,还不赶紧行动起来!