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 相关文章推荐
JS URL传中文参数引发的乱码问题
Sep 02 Javascript
Jsonp 跨域的原理以及Jquery的解决方案
May 18 Javascript
模拟select的代码
Oct 19 Javascript
JS中typeof与instanceof之间的区别总结
Nov 14 Javascript
js生成随机数之random函数随机示例
Dec 20 Javascript
JQuery中使用ajax传输超大数据的解决方法
Jul 14 Javascript
Javascript实现可旋转的圆圈实例代码
Aug 04 Javascript
基于jQuery的ajax方法封装
Jul 14 Javascript
Bootstrap中data-target 到底是什么
Feb 14 Javascript
基于Vue实现后台系统权限控制的示例代码
Aug 29 Javascript
seaJs使用心得之exports与module.exports的区别实例分析
Oct 13 Javascript
详解js加减乘除精确计算
Mar 19 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 获取SWF动画截图示例代码
2014/02/10 PHP
PHP实现的构造sql语句类实例
2016/02/03 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
2019/06/03 PHP
图片自动更新(说明)
2006/10/02 Javascript
最短的IE判断代码
2011/03/13 Javascript
js根据日期判断星座的示例代码
2014/01/23 Javascript
JavaScript中的DSL元编程介绍
2015/03/15 Javascript
JS显示下拉列表框内全部元素的方法
2015/03/31 Javascript
jQuery插件编写步骤详解
2016/06/03 Javascript
bootstrap-datetimepicker实现只显示到日期的方法
2016/11/25 Javascript
Angular 如何使用第三方库的方法
2018/04/18 Javascript
vue兄弟组件传递数据的实例
2018/09/06 Javascript
JS操作Fckeditor的一些常用方法(获取、插入等)
2020/02/19 Javascript
Js生成随机数/随机字符串的方法小结【5种方法】
2020/05/27 Javascript
[06:50]DSPL次级职业联赛十强晋级之路
2014/11/18 DOTA
[59:53]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第二场 3月6日
2021/03/11 DOTA
机器学习经典算法-logistic回归代码详解
2017/12/22 Python
pyqt5 实现工具栏文字图片同时显示
2019/06/13 Python
使用python模拟高斯分布例子
2019/12/09 Python
解决jupyter notebook import error但是命令提示符import正常的问题
2020/04/15 Python
详解Pycharm与anaconda安装配置指南
2020/08/25 Python
python如何提升爬虫效率
2020/09/27 Python
HTML5视频播放插件 video.js介绍
2018/09/29 HTML / CSS
荷兰在线体育用品商店:Avantisport.nl
2018/07/04 全球购物
印尼最大的网上书店:Gramedia.com
2018/09/13 全球购物
英国儿童鞋和靴子:Start-Rite
2019/05/06 全球购物
最新奶茶店创业计划书
2014/01/25 职场文书
电子商务专业求职信
2014/03/08 职场文书
幼儿园课题实施方案
2014/05/14 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
信贷客户经理岗位职责
2015/04/09 职场文书
校车司机安全责任书
2015/05/11 职场文书
北京青年观后感
2015/06/15 职场文书
党员证明模板
2015/06/19 职场文书
python文件与路径操作神器 pathlib
2022/04/01 Python