Ternary Search Tree 应用--搜索框智能提示
前面介绍了Ternary Search Tree和它的实现,那么可以用Ternary Search Tree来实现搜索框的只能提示,因为Ternary Search Tree的前缀匹配效率是非常高的,总体思路如下(其中很多可以根据自己的需要修改,我只是写出我的做法):
比如搜索歌曲时智能提示:
建立Ternary Search Tree
-
将所有歌曲名的字符串放置在一个map中,key为歌曲名、value存储歌曲信息,可以是一个类对象domain,在这里可以按照key值将相同歌曲的播放次数累加,并将歌曲名转为拼音,使用的是pinYin4J
-
将map转为歌曲对象list存储
-
在Node类中新增一个字段,index用以存放一个对象在list的下标值(这是关键的一部,是为了在Ternary Search Tree中查询到前缀为a的所有歌曲名拼音后,能获取到相应的index,直接在list中get(index),即能获取该歌曲的相应信息)
-
按照一首一尾将歌曲名拼音和该歌曲在list中的index插入到Ternary Search Tree中,原因参考--------------------------,为了使Ternary Search Tree平衡
查询
查询时,比如用户输入a,那么所有以a为前缀的歌曲名都要被搜寻出来
-
去Ternary Search Tree中查询以a为前缀的歌曲名,存入map,key为歌曲名拼音,value为index
-
根据index取得相应歌曲的信息
-
将歌曲播放数量作为value,index作为key放入treemap进行排序,改写comparator降序排列
-
从treemap中取n条记录,得到对应的resultList,根据index获取到相关歌曲信息
-
返回
总结一下,Ternary Search Tree是用来查询前缀匹配的所有歌曲
将所有匹配的歌曲查询出来后,还有根据某一字段排序等等进行一系列处理。
即 Ternary Search Tree查询 + topK排序
扩展
高亮功能
首字母匹配,即多建立一棵树,查询后按照播放次数排序去重
序列化Trie,避免每次重启都需要重建Trie,导致服务不可用
……
作者