自动完成的实现方法与拼音支持
2010-05-07 17:25
239 查看
关于自动完成,是一个比较老的技术了。最早由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的杂拼自动完成功能的实现还是有很大的兴趣,希望各位可以给予一些意见与讨论~~谢谢~~~
自动完成可以分成两种,一种是基于本地数据,另一种是基于服务器端。
基于本地数据的自动完成,适用于数据量少的情况,一次查询从服务器抓取全部数据,然后通过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的杂拼自动完成功能的实现还是有很大的兴趣,希望各位可以给予一些意见与讨论~~谢谢~~~
相关文章推荐
- js如何仿Google自动完成的实现方法与拼音支持的理论
- iOS引导登录、登录引导、login(点击某个功能按钮需要登录并且登录完成后自动跳转到要去的功能实现方法)
- jquery Autocomplete 实现自动补全(四)解决jquery 高版本不支持browser方法
- Ubuntu 配置VIM支持Python 完成YCM的安装实现自动补齐的功能
- 继承 System.Windows.Forms.ComboBox 实现支持自动完成功能的 ComboBox!个人感觉还可以!!!
- 自动完成实现方法(ajax,jqueyr,webserver)
- jQuery-ui中自动完成实现方法
- 用js实现在加载完成一个页面后自动执行一个方法
- .Net实现Windows服务安装完成后自动启动的两种方法
- 用js实现在加载完成一个页面后自动执行一个方法
- jQuery上传文件到服务器,实现量上传及压缩包导入,支持Office文档、PDF、图像、音视频和图纸等各类型文件。上传完成后系统自动为图片、音、视频类文件增加摘要及缩略图
- jQuery-ui中自动完成实现方法
- 用js实现在加载完成一个页面后自动执行一个方法
- 实现Linux Shell自动交互的三种方法----本人备注
- solr入门之拼音加汉字方式的搜索建议自动补全的不高效实现
- Jquery AutoComplete的使用方法实例(自动完成、自动填充)插件
- php基于str_pad实现卡号不足位数自动补0的方法
- HTML实现页面自动跳转的五种方法
- dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了
- 用struts2 完成一个简单的通讯录,实现增删改查,分页,文件上传(头像),表单验证(两种方法)