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 相关文章推荐
jQuery easyui datagrid动态查询数据实例讲解
Feb 26 Javascript
jquery特效 幻灯片效果示例代码
Jul 16 Javascript
JS调用CS里的带参方法实例
Aug 01 Javascript
2014 HTML5/CSS3热门动画特效TOP10
Dec 07 Javascript
jQuery实现表单提交时判断的方法
Dec 13 Javascript
js+HTML5实现视频截图的方法
Jun 16 Javascript
基于jQuery实现中英文切换导航条效果
Sep 18 Javascript
jQuery Datatable 多个查询条件自定义提交事件(推荐)
Aug 24 jQuery
JavaScript函数的特性与应用实践深入详解
Dec 30 Javascript
使用layui定义一个模块并使用的例子
Sep 14 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
Sep 26 Javascript
js 获取扫码枪输入数据的方法
Jun 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
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
php基础学习之变量的使用
2011/06/09 PHP
使用php将某个目录下面的所有文件罗列出来的方法详解
2013/06/21 PHP
php获取数组元素中头一个数组元素值的实现方法
2014/12/20 PHP
php使用Jpgraph创建折线图效果示例
2017/02/15 PHP
php UNIX时间戳用法详解
2017/02/16 PHP
PHP扩展mcrypt实现的AES加密功能示例
2019/01/29 PHP
Laravel使用原生sql语句并调用的方法
2019/10/09 PHP
prototype 1.5相关知识及他人笔记
2006/12/16 Javascript
微信js-sdk上传与下载图片接口用法示例
2016/10/12 Javascript
详解jQuery简单的表单应用
2016/12/16 Javascript
详谈js遍历集合(Array,Map,Set)
2017/04/06 Javascript
jquery处理checkbox(复选框)是否被选中实例代码
2017/06/12 jQuery
clipboard在vue中的使用的方法示例
2018/10/19 Javascript
JavaScript实现移动端弹窗后禁止滚动
2020/05/25 Javascript
Vue实现点击当前行变色
2020/12/14 Vue.js
Python中将字典转换为列表的方法
2016/09/21 Python
python操作mysql数据库
2017/03/05 Python
python条件变量之生产者与消费者操作实例分析
2017/03/22 Python
Python探索之pLSA实现代码
2017/10/25 Python
Python:Scrapy框架中Item Pipeline组件使用详解
2017/12/27 Python
python爬虫的一个常见简单js反爬详解
2019/07/09 Python
python 视频逐帧保存为图片的完整实例
2019/12/10 Python
Keras 切换后端方式(Theano和TensorFlow)
2020/06/19 Python
Linux系统下升级pip的完整步骤
2021/01/31 Python
css3实现椭圆轨迹旋转的示例代码
2018/10/29 HTML / CSS
html5 canvas fillRect坐标和大小的问题解决方法
2014/03/26 HTML / CSS
新加坡最受追捧的体验平台:Hapz
2018/01/01 全球购物
教师实习自我鉴定
2013/12/13 职场文书
酒店出纳岗位职责
2013/12/29 职场文书
中秋节主持词
2014/04/02 职场文书
村长贪污检举信
2014/04/04 职场文书
公司承诺书范文
2014/05/19 职场文书
Java中try catch处理异常示例
2021/12/06 Java/Android
SpringDataJPA在Entity中常用的注解介绍
2021/12/06 Java/Android
win10电脑关机快捷键是哪个 win10快速关机的几种方法
2022/08/14 数码科技