zoukankan      html  css  js  c++  java
  • JS高效关键字搜索转

    原文地址: http://www.cnblogs.com/index-html/archive/2013/04/17/js_keyword_match.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;
        }
    };



    使用实例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    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"]);
  • 相关阅读:
    Java第一次作业——Java语言基础
    P田日志<1>
    没解决的问题-git连接失败
    解决每次centos7执行java --version git --version等命令时都要重新source /etc/profile后才能执行,否则找不到命令-转载
    【Linux】VMware虚拟机中如何配置静态IP-转载
    Parallels Desktop 16 破解版 出现网络初始化失败和不能连接USB设备解决方法-转载
    Ubuntu安装git时出错,git-compat-util.h:280:25: fatal error: openssl/ssl.h: 没有那个文件或目录-转载
    遇到的问题29
    解决Idea 导入maven工程编译 Error running 'tms [clean]': Cannot run program "C:Program FilesJavajdk --转载
    jenkins执行shell命令时,提示“Command not found”处理方法-需要在jenkins调用shell脚本的最前面加一行脚本, #!/bin/bash -ilex-------转载
  • 原文地址:https://www.cnblogs.com/ry123/p/3039720.html
Copyright © 2011-2022 走看看