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 相关文章推荐
多个iframe自动调整大小的问题
Sep 18 Javascript
JS去除数组重复值的五种不同方法
Sep 06 Javascript
js通过location.search来获取页面传来的参数
Sep 11 Javascript
AngularJS学习笔记之基本指令(init、repeat)
Jun 16 Javascript
详解JavaScript基于面向对象之继承
Dec 13 Javascript
详解javascript的变量与标识符
Jan 04 Javascript
jQuery中的Deferred和promise 的区别
Apr 03 Javascript
element-ui多文件上传的实现示例
Apr 10 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
Jun 24 Javascript
基于node+websocket+html实现腾讯课堂聊天室聊天功能
Mar 04 Javascript
Vue实现仿iPhone悬浮球的示例代码
Mar 13 Javascript
基于Ionic3实现选项卡切换并重新加载echarts
Sep 24 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
一个用mysql_odbc和php写的serach数据库程序
2006/10/09 PHP
简单采集了yahoo的一些数据
2007/02/14 PHP
php笔记之:php数组相关函数的使用
2013/04/26 PHP
解析phpstorm + xdebug 远程断点调试
2013/06/20 PHP
php封装的连接Mysql类及用法分析
2015/12/10 PHP
php使用include 和require引入文件的区别
2017/02/16 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
2018/05/12 PHP
location.href 在IE6中不跳转的解决方法与推荐使用代码
2010/07/08 Javascript
filters.revealTrans.Transition使用方法小结
2010/08/19 Javascript
JS中判断null、undefined与NaN的方法
2014/03/24 Javascript
jQuery DataTables插件自定义Ajax分页实例解析
2020/04/28 Javascript
jQuery绑定自定义事件的魔法升级版
2016/06/30 Javascript
jQuery实现带延时功能的水平多级菜单效果【附demo源码下载】
2016/09/21 Javascript
原生JS获取元素集合的子元素宽度实例
2016/12/14 Javascript
JavaScript函数节流和函数防抖之间的区别
2017/02/15 Javascript
jQuery实现多张图片上传预览(不经过后端处理)
2017/04/29 jQuery
ubuntu编译nodejs所需的软件并安装
2017/09/12 NodeJs
jQuery实现form表单序列化转换为json对象功能示例
2018/05/23 jQuery
移动端(微信等使用vConsole调试console的方法
2019/03/05 Javascript
Vue 打包体积优化方案小结
2020/05/20 Javascript
[01:00] DOTA2英雄背景故事第五期之重力引力法则谜团
2020/07/16 DOTA
在GitHub Pages上使用Pelican搭建博客的教程
2015/04/25 Python
Python实现替换文件中指定内容的方法
2018/03/19 Python
Python自定义线程类简单示例
2018/03/23 Python
python中redis查看剩余过期时间及用正则通配符批量删除key的方法
2018/07/30 Python
python3 打印输出字典中特定的某个key的方法示例
2019/07/06 Python
Python替换月份为英文缩写的实现方法
2019/07/15 Python
关于Keras模型可视化教程及关键问题的解决
2020/01/24 Python
解决django中form表单设置action后无法回到原页面的问题
2020/03/13 Python
详解Python中如何将数据存储为json格式的文件
2020/11/18 Python
python中numpy数组与list相互转换实例方法
2021/01/29 Python
在PyCharm中安装PaddlePaddle的方法
2021/02/05 Python
公司培训欢迎词
2014/01/10 职场文书
加拿大探亲邀请信
2014/01/28 职场文书
新春文艺演出主持词
2014/03/27 职场文书
2015初中团支部工作总结
2015/07/21 职场文书