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 鼠标滚轮事件
Apr 09 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
May 20 Javascript
精心挑选的15款优秀jQuery 本特效插件和教程
Aug 06 Javascript
通过遮罩层实现浮层DIV登录的js代码
Feb 07 Javascript
JavaScript中的bold()方法使用详解
Jun 08 Javascript
jquery马赛克拼接翻转效果代码分享
Aug 24 Javascript
JS实现最简单的冒泡排序算法
Feb 15 Javascript
详解html-webpack-plugin用法全解
Jan 22 Javascript
Typescript 中的 interface 和 type 到底有什么区别详解
Jun 18 Javascript
利用layer实现表单完美验证的方法
Sep 26 Javascript
vue+ElementUI 关闭对话框清空验证,清除form表单的操作
Aug 06 Javascript
JavaScript 定时器详情
Nov 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
在WIN98下以apache模块方式安装php
2006/10/09 PHP
Yii框架引用插件和ckeditor中body与P标签去除的方法
2017/01/19 PHP
PHP数据库编程之MySQL优化策略概述
2017/08/16 PHP
script标签的 charset 属性使用说明
2010/12/04 Javascript
JS字符串累加Array不一定比字符串累加快(根据电脑配置)
2012/05/14 Javascript
javascript四舍五入函数代码分享(保留后几位)
2013/12/10 Javascript
利用jQuery实现可以编辑的表格
2014/05/26 Javascript
分享javascript计算时间差的示例代码
2020/03/19 Javascript
js弹出窗口返回值的简单实例
2016/05/28 Javascript
Bootstrap3 Grid system原理及应用详解
2016/09/30 Javascript
原生Javascript插件开发实践
2017/01/09 Javascript
JSON字符串操作移除空串更改key/value的介绍
2019/01/05 Javascript
[02:50]【扭转乾坤,只此一招】DOTA2全新版本永雾林渊开启新篇章
2020/12/24 DOTA
Python函数的周期性执行实现方法
2016/08/13 Python
Python调用C语言的方法【基于ctypes模块】
2018/01/22 Python
Python进程间通信Queue实例解析
2018/01/25 Python
浅析PHP与Python进行数据交互
2018/05/15 Python
对python以16进制打印字节数组的方法详解
2019/01/24 Python
python实现简单井字棋小游戏
2020/03/05 Python
python GUI库图形界面开发之PyQt5信号与槽事件处理机制详细介绍与实例解析
2020/03/08 Python
python用TensorFlow做图像识别的实现
2020/04/21 Python
解决python运行启动报错问题
2020/06/01 Python
python list等分并从等分的子集中随机选取一个数
2020/11/16 Python
html5实现完美兼容各大浏览器的播放器
2014/12/26 HTML / CSS
大女孩胸罩:Big Girls Bras
2016/12/15 全球购物
Aerosoles爱柔仕官网:美国舒软女鞋品牌
2017/07/17 全球购物
给海归自荐信的建议
2013/12/13 职场文书
英文留学推荐信范文
2014/01/25 职场文书
《守株待兔》教学反思
2014/03/01 职场文书
爱国主义演讲稿
2014/05/07 职场文书
幽默自我介绍演讲稿
2014/08/21 职场文书
政工例会汇报材料
2014/08/26 职场文书
观看《信仰》心得体会
2016/01/15 职场文书
新店开业策划方案怎么书写?
2019/07/05 职场文书
(开源)微信小程序+mqtt,esp8266温湿度读取
2021/04/02 Javascript
mysql 如何获取两个集合的交集/差集/并集
2021/06/08 MySQL