ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

用倍增法求后缀数组、名次数组-JavaScript

2020-06-26 16:05:05  阅读:243  来源: 互联网

标签:const 后缀 JavaScript hasSortArr let 数组 id 法求


用倍增法求后缀数组、名次数组

sa为后缀数组、rank为名次数组

//二分查找法,返回最接近的位置和实际位置
function binary_find(id,hasSortArr){
    let l=0,r=hasSortArr.length;
    let index=-1;
    while(r-l>0){
        const m=(l+r)>>1;
        const mid=hasSortArr[m]
        //比较下坐标大小
        const order=id>mid?1:(id<mid?-1:0)

        if(order===1){
            l=Math.max(l+1,m)
        }else if(order===-1){
            r=Math.min(r-1,m)
        }else{
            l=r=m;
            index=m;
        }
    }
    return [(l+r)>>1,index]
}
//二分法去重排序
function binary_sort(str) {
    const sa=[]
    for(let i=0;i<str.length;i++){
        const [n,index]=binary_find(str[i],sa);
        if(index===-1){
            sa.splice(n,0,str[i])
        }
    }
    return sa;
}

//后缀数组之获取名次数组
function getRank(str) {
    let arr=str.split('');
    const sLen=arr.length;//总共排名长度
    let uarr=binary_sort(arr);//获取排序去重后的
    const rank=[];
    let run=true;
    let len=1;//最长相似字符
    while (run){
        const map={}
        uarr.forEach(function (k,v) {
            map[k]=v;
        })
        for(let i=0;i<sLen;i++){
            rank[i]=map[arr[i]];
        }
        if(uarr.length<sLen){
            for(let i=0;i<sLen;i++){
                const fz=i+len<sLen?rank[i+len]:0;
                arr[i]=rank[i]*uarr.length+fz;
            }
            len=len*2;
            uarr=binary_sort(arr)
        }else{
            run=false;
        }
    }
    //sa为后缀数组、rank为名次数组
    // const sa=[]
    // rank.forEach(function (v,k) {
    //     sa[v]=k;
    // })
    return rank
}
const str='* 处理请求到的 OCR 信息safsdfafd12你3123123';
console.log(getRank(str))
/*
[
   3,  2, 28, 31, 33, 30, 27, 32,  0,
  14, 13, 15,  1, 26, 29, 23, 17, 22,
  24, 19, 20, 16, 21, 18,  6,  9, 25,
  12,  5,  8, 11,  4,  7, 10
]
*/

 

 

标签:const,后缀,JavaScript,hasSortArr,let,数组,id,法求
来源: https://www.cnblogs.com/caoke/p/13195253.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有