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学习4 浏览器的事件模型
Feb 07 Javascript
jquery click([data],fn)使用方法实例介绍
Jul 08 Javascript
jquery 提示信息显示后自动消失的具体实现
Dec 18 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
Jan 08 Javascript
JS建造者模式基本用法实例分析
Jun 30 Javascript
JS实现的自定义网页拖动类
Nov 06 Javascript
jQuery利用sort对DOM元素进行排序操作
Nov 07 Javascript
浅析上传头像示例及其注意事项
Dec 14 Javascript
微信小程序城市定位的实现实例(获取当前所在国家城市信息)
May 17 Javascript
原生JS上传大文件显示进度条 php上传文件代码
Mar 27 Javascript
解析Vue 2.5的Diff算法
Nov 28 Javascript
详解Vue.js在页面加载时执行某个方法
Nov 20 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封装的分页类与简单用法示例
2019/02/25 PHP
通过PHP设置BugFree获取邮箱通知
2019/04/25 PHP
javascript 动态加载 css 方法总结
2009/07/11 Javascript
在标题栏显示新消息提示,很多公司项目中用到这个方法
2011/11/04 Javascript
javascript的原生方法获取数组中的最大(最小)值
2012/12/19 Javascript
jquery重复提交请求的原因浅析
2014/05/23 Javascript
jQuery/CSS3图片特效插件整理推荐
2014/12/07 Javascript
js获取页面description的方法
2015/05/21 Javascript
jQuery实现html表格动态添加新行的方法
2015/05/28 Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
2017/02/18 Javascript
Node.js  REPL (交互式解释器)实例详解
2017/08/06 Javascript
JS实现运动缓冲效果的封装函数示例
2018/02/18 Javascript
搭建一个Koa后端项目脚手架的方法步骤
2019/05/30 Javascript
vue组件传值的实现方式小结【三种方式】
2020/02/05 Javascript
keep-alive不能缓存多层级路由菜单问题解决
2020/03/10 Javascript
javascript实现支付宝滑块验证码效果
2020/07/24 Javascript
浅谈vue项目,访问路径#号的问题
2020/08/14 Javascript
js删除对象中的某一个字段的方法实现
2021/01/11 Javascript
Python文本特征抽取与向量化算法学习
2017/12/22 Python
python模仿网页版微信发送消息功能
2018/02/24 Python
使用Python+wxpy 找出微信里把你删除的好友实例
2019/02/21 Python
django 外键创建注意事项说明
2020/05/20 Python
Python是什么 Python的用处
2020/05/26 Python
python中 _、__、__xx__()区别及使用场景
2020/06/30 Python
Pycharm制作搞怪弹窗的实现代码
2021/02/19 Python
美国最大的烧烤架和户外生活用品专业零售商:Barbeques Galore
2021/01/09 全球购物
Internet主要有哪些网络群组成
2015/12/24 面试题
Java中的基本数据类型所占存储空间大小固定的吗
2012/02/15 面试题
大学生自我鉴定
2013/12/16 职场文书
《小儿垂钓》教学反思
2014/02/23 职场文书
地球一小时宣传标语
2014/06/24 职场文书
组工干部演讲稿
2014/09/02 职场文书
学校总务处领导班子民主生活会对照检查材料思想汇报
2014/09/27 职场文书
银行授权委托书样本
2014/10/13 职场文书
企业年会祝酒词
2015/08/11 职场文书
redis cluster支持pipeline的实现思路
2021/06/23 Redis