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 淡入淡出 png图在ie8下有黑色边框的解决方法
Mar 05 Javascript
Jquery刷新页面背景图片随机变换的实现方法
Mar 15 Javascript
JQuery异步加载无限下拉框级联功能实现示例
Feb 19 Javascript
js 验证身份证信息有效性
Mar 28 Javascript
ActiveX控件与Javascript之间的交互示例
Jun 04 Javascript
JavaScript缓冲运动实现方法(2则示例)
Jan 08 Javascript
超实用的JavaScript表单代码段
Feb 26 Javascript
多种jQuery绑定事件的实现方式
Jun 13 Javascript
微信小程序如何获知用户运行小程序的场景教程
May 17 Javascript
JS实现搜索关键词的智能提示功能
Jul 07 Javascript
浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
Sep 19 Javascript
小程序实现侧滑删除功能
Jun 25 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自定义函数返回多个值
2006/11/26 PHP
PHP中使用数组实现堆栈数据结构的代码
2012/02/05 PHP
PHP中JSON的应用技巧
2015/10/10 PHP
jquery select 设置默认选中的示例代码
2014/02/07 Javascript
JavaScript中的getDay()方法使用详解
2015/06/09 Javascript
uploadify多文件上传参数设置技巧
2015/11/16 Javascript
AngularJS 模块化详解及实例代码
2016/09/14 Javascript
js获取元素的偏移量offset简单方法(必看)
2017/07/05 Javascript
Angular 2父子组件数据传递之@Input和@Output详解 (上)
2017/07/05 Javascript
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
nuxt中使用路由守卫的方法步骤
2019/01/27 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
2019/07/31 Javascript
Node.js使用MongoDB的ObjectId作为查询条件的方法
2019/09/10 Javascript
jQuery实现点击滚动到指定元素上的方法分析
2020/03/19 jQuery
Python使用cookielib模块操作cookie的实例教程
2016/07/12 Python
Python安装第三方库及常见问题处理方法汇总
2016/09/13 Python
Python探索之ModelForm代码详解
2017/10/26 Python
Python基础练习之用户登录实现代码分享
2017/11/08 Python
python编写朴素贝叶斯用于文本分类
2017/12/21 Python
对python:循环定义多个变量的实例详解
2019/01/20 Python
python3 selenium自动化 下拉框定位的例子
2019/08/23 Python
基于python全局设置id 自动化测试元素定位过程解析
2019/09/04 Python
Python3 读取Word文件方式
2020/02/13 Python
Pycharm学生免费专业版安装教程的方法步骤
2020/09/24 Python
Pycharm配置lua编译环境过程图解
2020/11/28 Python
基于Django集成CAS实现流程详解
2020/11/28 Python
用缩写的指针比较"if(p)" 检查空指针是否可靠?如果空指针的内部表达不是0会怎么样?
2014/01/05 面试题
几道数据库的面试题或笔试题
2014/05/31 面试题
家居设计专业个人自荐信范文
2013/11/26 职场文书
关于毕业的中学校园广播稿
2014/01/26 职场文书
文明风采获奖感言
2014/02/18 职场文书
车间机修工岗位职责
2014/02/28 职场文书
快餐公司创业计划书
2014/04/29 职场文书
落实八项规定专题民主生活会对照检查材料
2014/09/15 职场文书
党支部培养考察意见
2015/06/02 职场文书
详解Vue的列表渲染
2021/11/20 Vue.js