zoukankan      html  css  js  c++  java
  • 自动完成的实现方法与拼音支持

        关于自动完成,是一个比较老的技术了。最早由Google推出,在当时是一个很轰动的技术,到现在已经成为烂到满大街都是的技术了。在这里,主要讲一下后台方面,如何高效地支持自动完成,至于前端JS层的方法,已经有不少的文章里有讲到了。

        自动完成可以分成两种,一种是基于本地数据,另一种是基于服务器端。

         基于本地数据的自动完成,适用于数据量少的情况,一次查询从服务器抓取全部数据,然后通过JS来查询数据来实现自动完成。

         基于服务器的自动完成,需要每次向服务器请求数据,并进行展现。HTTP端,可以采用Cache与延时请求的方法来减轻服务器端的压力。

         要完成一次自动完成的请求,必须在要查找的数据集中,查找拥有共同前辍的字符串。完成这个过程最常使用的数据结构是Trie树,线性的查找效率使得这种结构相关受欢迎。但对于Trie树而言,会浪费大量的指针,对存储要求较高,虽然有压缩形的Trie树,但构建过程太耗时,成本过高。对于实时性要求较高的应用而言是无法满足的。

         Igor Ostrovsky这位仁兄,在“ http://igoro.com/archive/efficient-auto-complete-with-a-ternary-search-tree/”这篇文章中提到,使用三叉搜索树作为高效自动完成的数据结构,能够取得较好的效果。当需要自动完成是,从树的根结点向下走,到达单词末尾时,遍历以该结点为根结点的子树,提取其中的数据再输出。

         三叉搜索树基本上是Trie树的变形,每个树结点带有三个指针:left,center,right。其中,left与right均指向兄弟结点,而center指针指向子结点。将Trie树改造成三叉搜索树,能够减少空指针所占用的空间,但是造成查询效果较差。要获得较佳的性能,最好保证字符串插入时的无序,避免结点退化成单向链表。

         对于中文,自动完成面临更为严峻的挑战。必须要支持拼音的自动完成。

         在这里,讲述处理拼音自动完成的方法,由于本人技术有限,只实现了基本的全拼自动完成与拼音缩写自动完成,与Google的杂拼还是有一定的距离。要实现全拼与拼音缩写自动完成,必须有一个好用的拼音库,具体就不在这里说明了。还必须再构建两棵三叉搜索树,一个是基于全拼的三叉搜索树,一个是基于缩写的三叉搜索树,每次查找均从三棵树中找出结果后,再排序,去重,输出。通过这个简单的方法就成功实现了支持拼音的自动完成。

         但对于Google的杂拼自动完成功能的实现还是有很大的兴趣,希望各位可以给予一些意见与讨论~~谢谢~~~

  • 相关阅读:
    Java实现 蓝桥杯 算法提高 特等奖学金(暴力)
    Java实现 蓝桥杯 算法提高 特等奖学金(暴力)
    Java实现 蓝桥杯 算法提高 GPA(暴力)
    Java实现 蓝桥杯 算法提高 GPA(暴力)
    Java实现 蓝桥杯 算法提高 GPA(暴力)
    Java实现 蓝桥杯 算法提高 套正方形(暴力)
    Java实现 蓝桥杯 算法提高 套正方形(暴力)
    第一届云原生应用大赛火热报名中! helm install “一键安装”应用触手可及!
    云原生时代,2个方案轻松加速百万级镜像
    Knative 基本功能深入剖析:Knative Serving 自动扩缩容 Autoscaler
  • 原文地址:https://www.cnblogs.com/liangxing/p/1729924.html
Copyright © 2011-2022 走看看