zoukankan      html  css  js  c++  java
  • Ternary Search Tree 应用--搜索框智能提示

    前面介绍了Ternary Search Tree和它的实现,那么可以用Ternary Search Tree来实现搜索框的只能提示,因为Ternary Search Tree的前缀匹配效率是非常高的,总体思路如下(其中很多可以根据自己的需要修改,我只是写出我的做法):

    比如搜索歌曲时智能提示:

    建立Ternary Search Tree

    1. 将所有歌曲名的字符串放置在一个map中,key为歌曲名、value存储歌曲信息,可以是一个类对象domain,在这里可以按照key值将相同歌曲的播放次数累加,并将歌曲名转为拼音,使用的是pinYin4J
    2. 将map转为歌曲对象list存储
    3. 在Node类中新增一个字段,index用以存放一个对象在list的下标值(这是关键的一部,是为了在Ternary Search Tree中查询到前缀为a的所有歌曲名拼音后,能获取到相应的index,直接在list中get(index),即能获取该歌曲的相应信息)
    4. 按照一首一尾将歌曲名拼音和该歌曲在list中的index插入到Ternary Search Tree中,原因参考--------------------------,为了使Ternary Search Tree平衡

    查询

    查询时,比如用户输入a,那么所有以a为前缀的歌曲名都要被搜寻出来

    1. 去Ternary Search Tree中查询以a为前缀的歌曲名,存入map,key为歌曲名拼音,value为index
    2. 根据index取得相应歌曲的信息
    3. 将歌曲播放数量作为value,index作为key放入treemap进行排序,改写comparator降序排列
    4. 从treemap中取n条记录,得到对应的resultList,根据index获取到相关歌曲信息
    5. 返回

    总结一下,Ternary Search Tree是用来查询前缀匹配的所有歌曲

    将所有匹配的歌曲查询出来后,还有根据某一字段排序等等进行一系列处理。

    即 Ternary Search Tree查询 + topK排序

    扩展

    高亮功能

    首字母匹配,即多建立一棵树,查询后按照播放次数排序去重

     

    序列化Trie,避免每次重启都需要重建Trie,导致服务不可用

    ……

  • 相关阅读:
    Spring + mybatis 主从数据库分离读写的几种方式(二)
    Spring + mybatis 主从数据库分离读写的几种方式(一)
    AS3隐藏特性——深拷贝数据对象
    如何高效地抽离出两个数组中的相同元素
    资料合集2
    Trace类
    网页游戏心跳机制
    stage3d 你不知道的巨坑
    打包一组xml数据ByteArray
    利用BlendMode做镂空擦除效果
  • 原文地址:https://www.cnblogs.com/edwinchen/p/4580265.html
Copyright © 2011-2022 走看看