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 相关文章推荐
Google Map V3 绑定气泡窗口(infowindow)Dom事件实现代码
Apr 26 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
Aug 12 Javascript
javascript实现画不相交的圆
Apr 07 Javascript
基于jQuery和CSS3制作数字时钟附源码下载(jquery篇)
Nov 24 Javascript
全面了解javascript中的错误处理机制
Jul 18 Javascript
两种JavaScript的AES加密方式(可与Java相互加解密)
Aug 02 Javascript
javascript中setAttribute兼容性用法分析
Dec 12 Javascript
javascript输出AscII码扩展集中的字符方法
Dec 26 Javascript
jQuery UI Grid 模态框中的表格实例代码
Apr 01 jQuery
详解js的视频和音频采集
Aug 09 Javascript
vue-autoui自匹配webapi的UI控件的实现
Mar 20 Javascript
基于vue+element实现全局loading过程详解
Jul 10 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
全国FM电台频率大全 - 21 海南省
2020/03/11 无线电
PHP 增加了对 .ZIP 文件的读取功能
2006/10/09 PHP
浅谈PHP中其他类型转化为Bool类型
2016/03/28 PHP
php监测数据是否成功插入到Mysql数据库的方法
2016/11/25 PHP
基于CI框架的微信网页授权库示例
2016/11/25 PHP
PHP使用imagick扩展实现合并图像的方法
2017/04/25 PHP
js获取元素在浏览器中的绝对位置
2010/07/24 Javascript
将HTMLCollection/NodeList/伪数组转换成数组的实现方法
2011/06/20 Javascript
jqueyr判断checkbox组的选中(示例代码)
2013/11/08 Javascript
制作jquery遮罩层效果导航菜单代码分享
2013/12/25 Javascript
js实现键盘操作实现div的移动或改变的原理及代码
2014/06/23 Javascript
PHP中使用微秒计算脚本执行时间例子
2014/11/19 Javascript
jquery实现文本框的禁用和启用
2016/12/07 Javascript
JavaScript实现类似淘宝的购物车效果
2017/03/16 Javascript
移动端触屏幻灯片图片切换插件idangerous swiper.js
2017/04/10 Javascript
微信小程序学习笔记之函数定义、页面渲染图文详解
2019/03/28 Javascript
JavaScript中var的重要性实例分析
2019/07/09 Javascript
JavaScript修改注册表实例代码
2020/01/05 Javascript
vue组件创建的三种方式小结
2020/02/03 Javascript
Python基础教程之浅拷贝和深拷贝实例详解
2017/07/15 Python
利用numpy实现一、二维数组的拼接简单代码示例
2017/12/15 Python
Python callable()函数用法实例分析
2018/03/17 Python
Python排序算法之选择排序定义与用法示例
2018/04/29 Python
Python+OpenCV图片局部区域像素值处理改进版详解
2019/01/23 Python
python调用API接口实现登陆短信验证
2020/05/10 Python
浅析两列自适应布局的3种思路
2016/05/03 HTML / CSS
HTML5新特性之type=file文件上传功能
2018/02/02 HTML / CSS
Under Armour安德玛荷兰官网:美国高端运动科技品牌
2019/07/10 全球购物
通用C#笔试题附答案
2016/11/26 面试题
Linux上比较文件的命令都有哪些
2013/09/28 面试题
后勤人员岗位职责
2013/12/17 职场文书
数学教学随笔感言
2014/02/17 职场文书
语文教育专业求职信
2014/06/28 职场文书
旅游活动总结
2014/08/27 职场文书
政协委员个人总结
2015/03/03 职场文书
redis复制有可能碰到的问题汇总
2022/04/03 Redis