JavaScript 上万关键字瞬间匹配实现代码


Posted in Javascript onJuly 07, 2013

提到关键字搜索,首先联想到的无非就是使用一些indexOf,replace之类的字符函数,最多加上一些正则表达式而已.实现起来虽然很简单,但是这背后的效率问题可曾仔细考虑过?例如论坛中的关键字过滤,一般情况下需过滤的关键字数量及检测的文本长度都不大,所以这一瞬间的过程没有太多值得关注的地方。但若关键字数量不在是屈指可数,而是有成千上万, 并且待检测的文本也是一长篇大论,结果可不再是那么乐观了。大家都知道,每多一个关键字,就要增加一次全文的检索,最终花费的时间将远远超出可接受的范围内。

既然考虑的是那种极端的关键字搜索,通常的逐个遍历搜索显然是行不通的。如今用的是JavaScript,若不使用Hash表实在是太对不起这门语言了。有着对表特天独厚的支持,不妨就拿出少量的空间来换取大量的时间吧。

先看个例子,比如有如下的关键字: foo1,foo2,bar1,bar2,既然要用空间换时间,因此搜索之前先将他们预处理。前面提到了JS灵活又高效的表,显而易见,使用树的结构是最有优势的。即使不明白,也没关系,最终实现结构正如如下的代码,熟悉JSON同样很亲切:

var Root =
{
    f:
    {
        o:
        {
            o:
            {
: true,
: true
            }
        }
    },
    b:
    {
        a:
        {
             r:
            {
: true,
: true
            }
        }
    }
};

这一层层的结构正如一棵树,每个字符便是树的一个分枝,到了最后一个字符便是树叶,不再有新的节点。

此时你应该明白了,只要对文章的每个字沿着这棵树往下搜就是了。能到达树叶的,就说明当前字符就是关键字的一个;中途寻找不到对应枝干的,当然就不是关键字。

例如foo1,顺着Root结构向下访问,最终到达Root['f']['o']['o']['1'],即完成了一次匹配。之后跳过foo1的长度,继续往后检索。

因此,整篇文章只需一次检索,即可找出每个关键字的位置。

由于JS的hash表性能非常高,所以所谓的寻找枝干也就非常的快了。因为JS的灵活性,实现此效果的代码同样很简短。

事实上可以发现,关键字的数量与搜索的时间并没太多的关系,那仅仅影响了树的宽度而已,只有文章的长度才是决定搜索的时间。

来一次极限测试:

关键字: 成语全集(19830条)

内容:诛仙全集.txt (1659219字)

用时:935ms

(Chrome26 / i3-2312的CPU)
160万字的文章,匹配2万个关键字,还不到1秒的时间。可见,充分利用JavaScript的灵活性,仍能发挥很大的潜力。

Javascript 相关文章推荐
JavaScript弹簧振子超简洁版 完全符合能量守恒,胡克定理
Oct 25 Javascript
JavaScript 原型继承
Dec 26 Javascript
用JS实现3D球状标签云示例代码
Dec 01 Javascript
使用Javascript简单实现图片无缝滚动
Dec 05 Javascript
jQuery插件Elastislide实现响应式的焦点图无缝滚动切换特效
Apr 12 Javascript
理解JavaScript表单的基础知识
Jan 25 Javascript
详解Angular中$cacheFactory缓存的使用
Aug 19 Javascript
基于Vuex无法观察到值变化的解决方法
Mar 01 Javascript
MVVM 双向绑定的实现代码
Jun 21 Javascript
vue-resource请求实现http登录拦截或者路由拦截的方法
Jul 11 Javascript
微信小程序添加插屏广告并设置显示频率(一天一次)
Dec 06 Javascript
package.json各个属性说明详解
Mar 11 Javascript
20行代码实现的一个CSS覆盖率测试脚本
Jul 07 #Javascript
在JavaScript里嵌入大量字符串常量的实现方法
Jul 07 #Javascript
JQuery表格内容过滤的实现方法
Jul 05 #Javascript
JS动态创建Table,Tr,Td并赋值的具体实现
Jul 05 #Javascript
Javascript实现动态菜单添加的实例代码
Jul 05 #Javascript
javascript实现跳转菜单的具体方法
Jul 05 #Javascript
JavaScript获取和设置CheckBox状态的简单方法
Jul 05 #Javascript
You might like
浅谈PHP Cookie处理函数
2016/06/10 PHP
PHP htmlspecialchars_decode()函数用法讲解
2019/03/01 PHP
PHP实现Markdown文章上传到七牛图床的实例内容
2020/02/11 PHP
EasyUI 中 MenuButton 的使用方法
2012/07/14 Javascript
jquery 关于event.target使用的几点说明介绍
2013/04/26 Javascript
两个select多选模式的选项相互移动(示例代码)
2014/01/11 Javascript
javascript使用prototype完成单继承
2014/12/24 Javascript
深入浅析Bootstrap列表组组件
2016/05/03 Javascript
Javascript基础回顾之(三) js面向对象
2017/01/31 Javascript
JS前端开发判断是否是手机端并跳转操作(小结)
2017/02/05 Javascript
angularjs中回车键触发某一事件的方法
2017/04/24 Javascript
JavaScript函数绑定用法实例分析
2017/11/14 Javascript
JavaScript控制浏览器全屏显示简单示例
2018/07/05 Javascript
bootstrap+spring boot实现面包屑导航功能(前端代码)
2019/10/09 Javascript
node.js使用yargs处理命令行参数操作示例
2020/02/11 Javascript
[04:29]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/02/01 DOTA
在Django中使用Sitemap的方法讲解
2015/07/22 Python
使用Turtle画正螺旋线的方法
2017/09/22 Python
Python搭建FTP服务器的方法示例
2018/01/19 Python
python将一个英文语句以单词为单位逆序排放的方法
2018/12/20 Python
Python学习笔记之图片人脸检测识别实例教程
2019/03/06 Python
python PIL模块的基本使用
2020/09/29 Python
python中time包实例详解
2021/02/02 Python
舞蹈教育学专业推荐信
2013/11/27 职场文书
会计助理的岗位职责
2013/11/29 职场文书
高中地理教学反思
2014/01/29 职场文书
2014年预备党员学习两会心得体会
2014/03/17 职场文书
群众路线剖析材料范文
2014/10/09 职场文书
党的群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
团员个人总结
2015/02/26 职场文书
任命书标准格式
2015/03/02 职场文书
百年孤独读书笔记
2015/06/29 职场文书
大学军训口号大全
2015/12/24 职场文书
如何计划开一家便利店?
2019/07/31 职场文书
如何让vue长列表快速加载
2021/03/29 Vue.js
OpenCV-Python实现人脸磨皮算法
2021/06/07 Python