自动完成的实现方法与拼音支持

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

posted @ 2010-05-07 17:25  梁星  阅读(3842)  评论(4编辑  收藏  举报
Mobile and Web Analytics