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 动态生成私有变量访问器
Dec 06 Javascript
用jquery实现学校的校历(asp.net+jquery ui 1.72)
Jan 01 Javascript
window.requestAnimationFrame是什么意思,怎么用
Jan 13 Javascript
你必须知道的Javascript知识点之"单线程事件驱动"的使用
Apr 23 Javascript
js实现鼠标触发图片抖动效果的方法
Feb 27 Javascript
javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
Apr 01 Javascript
Bootstrap基本插件学习笔记之按钮(21)
Dec 08 Javascript
详解AngularJS ui-sref的简单使用
Apr 24 Javascript
vue实现的双向数据绑定操作示例
Dec 04 Javascript
js实现ATM机存取款功能
Oct 27 Javascript
jquery实现自定义树形表格的方法【自定义树形结构table】
Jul 12 jQuery
js实现弹框效果
Mar 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
给php新手谈谈我的学习心得
2007/02/25 PHP
php实现的SESSION类
2014/12/02 PHP
php实现的操作excel类详解
2016/01/15 PHP
php实现爬取和分析知乎用户数据
2016/01/26 PHP
Linux下快速搭建php开发环境
2017/03/13 PHP
javascript语言结构小记(一)
2011/09/10 Javascript
ASP.NET中AJAX 调用实例代码
2012/05/03 Javascript
JavaScript数据存储 Cookie篇
2016/07/02 Javascript
form表单序列化详解(推荐)
2017/08/15 Javascript
vue如何在自定义组件中使用v-model
2018/05/14 Javascript
jQuery实现的自定义轮播图功能详解
2018/12/28 jQuery
js滚轮事件 js自定义滚动条的实现
2020/01/18 Javascript
centos系统升级python 2.7.3
2014/07/03 Python
探索Python3.4中新引入的asyncio模块
2015/04/08 Python
Python黑魔法@property装饰器的使用技巧解析
2016/06/16 Python
使用Python生成XML的方法实例
2017/03/21 Python
Python实现发送与接收邮件的方法详解
2018/03/28 Python
django-allauth入门学习和使用详解
2019/07/03 Python
python查看文件大小和文件夹内容的方法
2019/07/08 Python
python 获取计算机的网卡信息
2021/02/18 Python
Lampegiganten丹麦:欧洲领先的照明网上商店
2018/04/25 全球购物
美国在线眼镜店:GlassesShop
2018/11/15 全球购物
师范生自荐信范文
2013/10/06 职场文书
读书心得体会
2013/12/28 职场文书
《伯牙绝弦》教学反思
2014/03/02 职场文书
物流管理专业毕业生自荐信
2014/03/04 职场文书
竞聘上岗演讲稿
2014/05/16 职场文书
捐助贫困学生倡议书
2014/05/16 职场文书
媒矿安全生产承诺书
2014/05/23 职场文书
2014房屋登记授权委托书
2014/10/13 职场文书
大学生入党自荐书
2015/03/05 职场文书
讲文明倡议书
2015/04/29 职场文书
高考1977观后感
2015/06/04 职场文书
深入理解Vue的数据响应式
2021/05/15 Vue.js
Python办公自动化之Excel(中)
2021/05/24 Python
python字符串的一些常见实用操作
2022/04/06 Python