自动完成的实现方法与拼音支持
关于自动完成,是一个比较老的技术了。最早由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的杂拼自动完成功能的实现还是有很大的兴趣,希望各位可以给予一些意见与讨论~~谢谢~~~