码迷,mamicode.com
首页 > 编程语言 > 详细

很简陋的kmp算法

时间:2015-05-22 18:45:18      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:

/**
 * Created by cdpmac on 15/5/20.
 */
var mainstr="BCDABCADABCABACABCAB";
var substr=       "ABCAB";
//
//for(var i =0;i<mainstr.length;){
//    //是否需要匹配子的下一位
//    var next=true;
//    var subparindex=i;
//    for(var j =0;j<substr.length;){
//        //匹配下一位。
//        if(next){
//            //如果匹配的项相同,则子和父都后移一位
//            console.log(subparindex+‘‘+mainstr[subparindex]+j+substr[j]);
//            if(mainstr[subparindex]==substr[j]){
//                subparindex++;
//                j++;
//            }
//            //如果匹配的不同,则不用匹配了。
//            else{
//                next=false;
//                j=substr.length;
//            }
//        }
//    }
//    i++;
//    if(next==true){
//        console.log(‘get‘);
//    }
//    else{
//        console.log(‘parent go next  ‘+ i);
//    }
//}

//笨办法
//kmp算法就是利用 已知的匹配项信息,如上例,在index为9 处子 ABCABC已经匹配了 父的 ABCABD中ABCAB
//基本办法,还是对父的ABCABD 移到了 第二个B项处。其实子已经匹配了父的ABCAB,我们确信父的对应位置也是ABCAB
//我们可以取前后的相同位置这样移动
//基础
//BCDABCABDABCABCD
//   ABCABD
//不成
//BCDABCABDABCABCD
//    ABCABD
//
////KMP
//BCDABCABDABCABCD
//      ABCABD
//基础只移动一位
//kmp我们算算要移动几位
//匹配了ABCAB 5位。我们先往后5位。
//之后取已匹配项的头尾相同项,这里是两位AB
//
//BCDABCABDABCABCD
//        ABCABD
//理想的情况是移到这里
//BCDABCABDABCABCD
//      ABCABD
//实际为5-2;


function getnextstep(arr){
    var matchmax=0;
    var match=0;
    while(arr.length>1&&matchmax<arr.length/2){
        var ismatch=true;
        for(var i=0;i<=matchmax;i++){
            if(arr[i]!=arr[arr.length-1+i-matchmax]){
                ismatch=false;
                break;
            }
        }
        if(ismatch){
            match=matchmax;
        }
        //试着再多一位去匹配;
        matchmax++;
    }
    //则最大匹配个数+1(因为是从0算起);
    return match+1;
}

//console.log(getnextstep("ABBABB"));
kmp();
function kmp(){
    for(var i =0;i<mainstr.length;){
        //是否需要匹配子的下一位
        var next=true;
        var subparindex=i;
        var subindex=0;
        var j=0;
        for(;j<substr.length;){
            //匹配下一位。
            if(next){
                //如果匹配的项相同,则子和父都后移一位
                if(mainstr[subparindex]==substr[j]){
                    subparindex++;
                    subindex++;
                    j++;
                }
                //如果匹配的不同,则不用匹配了。
                else{
                    next=false;
                    j=substr.length;
                }
            }
        }
        var match=substr.substring(0,subindex);
        if(!match){
            i++;
        }
        else{
            console.log(match +‘ 子同项 ‘+getnextstep(match));
            console.log(‘ 父移动到 ‘+(i+subindex-getnextstep(match)));
            j=getnextstep(match);
            i=i+(subindex+1)-getnextstep(match);
        }
        if(next==true){
            console.log(‘get‘);
        }
        else{
            console.log(‘parent go next  ‘+ i);
        }
    }
}

 

很简陋的kmp算法

标签:

原文地址:http://www.cnblogs.com/zihunqingxin/p/4522971.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!