JavaScript 上万关键字瞬间匹配——借助Hash表快速匹配
来源:
http://www.cnblogs.com/index-html/archive/2013/04/17/js_keyword_match.html
http://www.etherdream.com/funnyscript/Keyword/Keyword.html
适用于多关键字、大文本匹配,若关键字只有一个,则只是最朴素的字符串匹配(逐个匹配),没显示作用。
- var treeSearch = {
- makeTree: function(strKeys) {
- "use strict";
- var tblCur = {},
- tblRoot,
- key,
- str_key,
- Length,
- j,
- i
- ;
- tblRoot = tblCur;
- for ( j = strKeys.length - 1; j >= 0; j -= 1) {
- str_key = strKeys[j];
- Length = str_key.length;
- for ( i = 0; i < Length; i += 1) {
- key = str_key.charAt(i);
- if (tblCur.hasOwnProperty(key)) { //生成子节点
- tblCur = tblCur[key];
- } else {
- tblCur = tblCur[key] = {};
- }
- }
- tblCur.end = true; //最后一个关键字没有分割符
- tblCur = tblRoot;
- }
- return tblRoot;
- },
- search: function(content, tblRoot) {
- "use strict";
- var tblCur,
- p_star = 0,
- n = content.length,
- p_end,
- match, //是否找到匹配
- match_key,
- match_str,
- arrMatch = [], //存储结果
- arrLength = 0 //arrMatch的长度索引
- ;
- while (p_star < n) {
- tblCur = tblRoot; //回溯至根部
- p_end = p_star;
- match_str = "";
- match = false;
- do {
- match_key = content.charAt(p_end);
- if (!(tblCur = tblCur[match_key])) { //本次匹配结束
- p_star += 1;
- break;
- }else{
- match_str += match_key;
- }
- p_end += 1;
- if (tblCur.end === true) //是否匹配到尾部 //找到匹配关键字
- {
- match = true;
- }
- } while (true);
- if (match === true) { //最大匹配
- arrMatch[arrLength] = { //增强可读性
- key: match_str,
- begin: p_star - 1,
- end: p_end
- };
- arrLength += 1;
- p_star = p_end;
- }
- }
- return arrMatch;
- }
- };
- function test(strContent, strKeys) {
- var arrMatch,
- tblRoot = treeSearch.makeTree(strKeys),
- t = new Date();
- arrMatch = treeSearch.search(strContent, tblRoot);
- console.log("time is: " + (new Date() - t) + "mm");
- console.log(arrMatch);
- }
- var s = (function() {
- var Things = [' ', '\n', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
- var s = "";
- for (var i = 1000000; i >= 0; i--) {
- s += Things[parseInt(Math.random() * Things.length) % Things.length]
- };
- return s;
- })()
- test(s, ["abc", "efge", "fun", "tree"]);
JavaScript 上万关键字瞬间匹配——借助Hash表快速匹配的更多相关文章
- PHP数组/Hash表的实现/操作、PHP变量内核实现、PHP常量内核实现 - [ PHP内核学习 ]
catalogue . PHP Hash表 . PHP数组定义 . PHP变量实现 . PHP常量实现 1. PHP Hash表 0x1: 基本概念 哈希表在实践中使用的非常广泛,例如编译器通常会维护 ...
- 十一、从头到尾彻底解析Hash 表算法
在研究MonetDB时深入的学习了hash算法,看了作者的文章很有感触,所以转发,希望能够使更多人受益! 十一.从头到尾彻底解析Hash 表算法 作者:July.wuliming.pkuoliver ...
- Hash表算法
出处:http://blog.csdn.net/v_JULY_v 第一部分:Top K 算法详解问题描述百度面试题: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的 ...
- 【数据结构】非常有用的hash表
这篇博客的目的是让尚未学会hash表的朋友们对hash表有一个直观的理解,并且能根据本文定义出属于自己的第一个hash表,但算不上研究文,没有深究概念和成功案例. 什么是has ...
- 从头到尾彻底解析Hash表算法
作者:July.wuliming.pkuoliver 说明:本文分为三部分内容, 第一部分为一道百度面试题Top K算法的详解:第二部分为关于Hash表算法的详细阐述:第三部分为打造一个最快的Hash ...
- Rolling Hash(Rabin-Karp算法)匹配字符串
您可以在我的个人博客中访问此篇文章: http://acbingo.cn/2015/08/09/Rolling%20Hash(Rabin-Karp%E7%AE%97%E6%B3%95)%E5%8C%B ...
- 从头到尾解析Hash表算法
via:点击打开链接 十一.从头到尾解析Hash 表算法 作者:July.wuliming.pkuoliver 出处:http://blog.csdn.net/v_JULY_v. 说明:本文分 ...
- 从头到尾彻底解析Hash 表算法
作者:July.wuliming.pkuoliver 出处:http://blog.csdn.net/v_JULY_v. 说明:本文分为三部分内容, 第一部分为一道百度面试题Top K算法的 ...
- (面试)Hash表算法十道海量数据处理面试题
Hash表算法处理海量数据处理面试题 主要针对遇到的海量数据处理问题进行分析,参考互联网上的面试题及相关处理方法,归纳为三种问题 (1)数据量大,内存小情况处理方式(分而治之+Hash映射) (2)判 ...
随机推荐
- js 中的算法题,那些经常看到的
js中遇到的算法题不是很多,可以说基本遇不到.但面试的时候,尤其是一些大公司,总是会出这样那样的算法题,考察一个程序员的逻辑思维能力.如下: 1.回文. 回文是指把相同的词汇或句子,在下文中调换位置或 ...
- wooyun本地数据抓取
---- #-*-coding:utf-8-*- import re import urllib import MySQLdb import time from urllib import unquo ...
- HashMap 中的 entrySet()使用方法 2016.12.28
package map; import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; import ...
- [CareerCup] 2.6 Linked List Cycle 单链表中的环
2.6 Given a circular linked list, implement an algorithm which returns the node at the beginning of ...
- Linux第四次学习笔记
程序的机器级表示 寻址方式的演变 DOS → 8086 → IA32 Inter处理器系列俗称x86,其演变过程(根据其所需要的晶体管数量来说明): 8086 → 80286 → i386 → i48 ...
- Android WebView使用深入浅出
目前很多android app都内置了可以显示web页面的界面,会发现这个界面一般都是由一个叫做WebView的组件渲染出来的,学习该组件可以为你的app开发提升扩展性. 先说下WebView的一些优 ...
- memcached 适用的场景
最近在看 memcached 的公共课,发现memcache的确是个好东西,可以显著地减小数据库负载,当然我们要搞清楚,任何一样技术都有它的优缺点, 在使用它的时候,搞清楚它的适用场景,才能扬长避短 ...
- php图片水印添加,压缩,剪切的封装类
php对图片文件的操作主要是利用GD库扩展.当我们频繁利用php对图片进行操作时,会自然封装很多函数,否则会写太多重复的代码.当有很多对图片的相关函数的时候,我们可以考虑将这些函数也整理一下,因而就有 ...
- 人家为撩妹就鼓捣个网页,我做了个约炮APP(已开源)
每年初夏第一场雷雨刚过,漫步河边的草坪,总是能闻到伴随着泥土的清新,这不是coco的前香,让人神魂颠倒:也不是gucci的后香,让人痴迷如梦.如24节气一样,它提醒人们,夏天到了.昨晚成都下了第一场雷 ...
- bower入门
一.bower简介 bower是一个基于js的包管理工具,类似于java的maven. 官方网站:http://bower.io/ 二.安装bower 使用bower,首先要安装node npm和gi ...