JavaScript 上万关键字瞬间匹配实现代码

更新时间:2013年07月07日 23:36:21   作者:

发一篇之前写的文章,平时还是经常用到的,尤其是河蟹词特别多的聊天系统里

提到关键字搜索,首先联想到的无非就是使用一些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的灵活性,仍能发挥很大的潜力。

相关文章

仿服务器端脚本方式的JS模板实现方法...2007-04-04

本文主要分享一篇关于Html A标签中href和onclick用法、区别、优先级别,具有很好的参考价值,有需要了解的朋友可以看看2017-01-01

这篇文章主要为大家详细介绍了Bootstrap基本插件学习笔记之折叠的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2016-12-12

这篇文章主要介绍了ES6学习笔记之Set和Map数据结构,结合实例形式详细分析了ECMAScript中基本数据结构Set和Map的常用属性与方法的功能、用法及相关注意事项,需要的朋友可以参考下2017-04-04

这篇文章主要介绍了使用Javascript实现图片加载从模糊到清晰显示的方法,通俗易懂,需要的朋友可以参考下。2016-06-06

函数是js世界的一等公民,js的动态性、易变性在函数的应用上,体现的淋漓尽致。下面这篇文章主要给大家介绍了关于JavaScript学习笔记之惰性函数的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。2017-08-08

最近接了个项目,其中有项目需求是这样的,需要复制内容到剪切板,因为有众多浏览器,所以兼容性很重要,下面通过本文给大家介绍Javascript复制实例详解,对js复制相关知识感兴趣的朋友一起学习吧2016-01-01

这篇文章主要介绍了React 元素渲染的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下2020-07-07

impress.js 是国外一位开发者受 Prezi 启发,采用 CSS3 与 JavaScript 语言完成的一个可供开发者使用的表现层框架(演示工具)。感兴趣的朋友跟着小编一起学习吧2015-09-09

这篇文章主要介绍了Javascript中arguments用法,实例分析了javascript利用arguments实现模拟重载功能,需要的朋友可以参考下2015-06-06

最新评论

php 上万关键字匹配,JavaScript 上万关键字瞬间匹配实现代码相关推荐

  1. php 如何实现关键字查找,javascript、php关键字搜索函数的使用方法

    javascript: a. 代码: /* @desc:js搜索函数,可用于关键字匹配 @param key 关键字 @param str 要搜索的字符串 @return out 匹配关键字前后出现的 ...

  2. Javascript this关键字 指向详解

    Javascript this关键字 指向详解 面向对象语言中 this 表示当前对象的一个引用.在 JavaScript 中 this 不是固定不变的,它会随着执行环境的改变而改变. 1) 单独使用 ...

  3. python 多关键字匹配_使用django的objects.filter()方法匹配多个关键字的方法

    介绍: 今天在使用django的时候忽然想用到,如何匹配多个关键字的操作,我们知道django有一个objects.filter()方法,我们可以通过如下一句代码实现匹配数据库中title包含key关 ...

  4. JavaScript保留关键字及危险变量名

    JavaScript保留关键字及危险变量名 定义变量名需谨慎 在开发过程当中,如果没有必要就尽可能少的使用以下列出的单词作为变量名称或者属性名称,关键字是严格不允许,而浏览器定义的变量名或者类名在使用 ...

  5. javascript的关键字

    Javascript关键字(Reserved Words)是指在Javascript语言中有特定含义,成为Javascript语法中一部分的那些字.Javascript关键字是不能作为变量名和函数名使 ...

  6. Grep命令查找多个字符串(grep同时匹配多个关键字或任意关键字)

    前言 grep 命令支持三种正则表达式语法:Basic.Extended 和 Perl-compatible .当没有指定正则表达式类型时,grep 命令将搜索模式默认为基本正则表达式. 要搜索多个匹 ...

  7. 【Linux】grep 匹配多个关键字

    grep 命令非常常用,经常用于匹配文本字符. 一般情况下,grep 命令只能匹配一个关键字,怎么实现匹配多个关键字呢? 下面看几种情况: 1. grep '字符串' 这是最普通的使用方式: 匹配文件 ...

  8. SQL JOIN\SQL INNER JOIN 关键字\SQL LEFT JOIN 关键字\SQL RIGHT JOIN 关键字\SQL FULL JOIN 关键字...

    SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据. Join 和 Key 有时为了得到完整的结果,我们需要从两个或更多的表中获取结果.我们就需要执行 join. 数据库中的表 ...

  9. java关键字的作用_java关键字及其作用

    java关键字及其作用 java 关键字及其作用 一. 关键字总览:关键字 含义abstract 表明类或者成员方法具有抽象属性assert 用来进行程序调试boolean 基本数据类型之一,布尔类型 ...

最新文章

  1. 在apache中使用 memcache 来作 session 存储
  2. 003_ActiveMQ管理后台
  3. 解复用FLV文件(基于FFMPEG解析FLV(h264+aac))
  4. 通过Lazada日销千件,国内爆款如此打开东南亚爆单之门
  5. MySQL Windows ZIP 免费安装和启动设置
  6. 设置静态ip上网_开始使用第一步:连上网线换个皮
  7. C++(18)--复制构造函数
  8. 嵌入式开发板01---点亮LED
  9. layui 如何清空form表单
  10. 2020毕业论文写作大礼包(内含无限次免费查重、降重等软件)(福利)
  11. 大疆网上测评题库_网上测评有什么技巧或者题库推荐?
  12. 单位个人计算机 数据备份,个人所得税软件数据备份,您必须知道的5件事
  13. 软测量作业matlab_用偏最小二乘法PLS求解回归方程
  14. 孙子兵法始计篇读后感&心得(上)
  15. python50图_菊安酱和菜菜的Python可视化50图
  16. ElasticSearch(ik分词器)+SpringBoot站内全文搜索解决方案
  17. cesium加载地形
  18. 毕业设计之甘特图制作
  19. react中数组添加值,超时设置
  20. 【沉浸式腾讯云服务器部署安装docker】

热门文章

  1. 1114 Family Property (25 分)【难度: 中/ 知识点: 并查集】
  2. 2021暑假每日一题 【week8 完结】
  3. Acwing第 4 场周赛【未完结】
  4. ConcurrentMap接口
  5. 中心对称又是轴对称的图形_解读坐标系中图形变换的规律
  6. kettle将文件路径定义为_kettle_步骤解释
  7. python中gettext文件格式_Python locale.gettext方法代码示例
  8. 你的 IDEA 酷不酷?
  9. 11 张流程图帮你搞定 Spring Bean 生命周期 (核心)
  10. Java 集合系列(3): fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)...