zoukankan      html  css  js  c++  java
  • 超简单的求后缀数组算法-JavaScript

    //查找
    function find(str,hasSortArr,callback) {
        let l=0,r=hasSortArr.length;
        let index=-1;
        if(hasSortArr.length>0){
            const ri=callback(str,hasSortArr[r-1]);
            if(ri===1){
                return [r,-1]
            }else if(ri===0){
                return [r-1,r-1]
            }else{
                r=r-1;
            }
            const li=callback(str,hasSortArr[0]);
            if(li===-1){
                return [0,-1]
            }else if(li===0){
                return [0,0]
            }else{
                l=l+1;
            }
            while(r-l>0){
                const m=(l+r)>>1;
                //比较下坐标大小
                const order=callback(str,hasSortArr[m])
                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]
    }
    //SA[i]表示排名为i的后缀下标、rk[i]表示起始位置的下标为i的后缀的排名
    function getSa(str) {
        const sLen=str.length;//总共排名长度
        //排名函数
        const compare=function (n1,n2) {
            let dis=0;
            let len=0;
            while (dis===0){
                //超过字符,返回小于
                if(n1+len===sLen){
                    dis=-1
                }else if(str[n1+len]>str[n2+len]){
                    dis=1;
                }else if(str[n1+len]<str[n2+len]){
                    dis=-1;
                }else{
                    len++;
                }
            }
            return dis;
        };
        //后缀数组
        const sa=[];
        for(let i=0;i<sLen;i++){
            const [n,index]=find(i,sa,compare)
            sa.splice(n,0,i)
        }
    
        return sa
    }
    //SA[i]表示排名为i的后缀下标
    const sa=getSa('123123');
    console.log(sa);//=>[ 3, 0, 4, 1, 5, 2 ]
  • 相关阅读:
    HTML文件中表格(Table)标记的常用属性
    QTP 学习
    QTP与Selenium的比较
    loadrunner简单使用——HTTP,WebService,Socket压力测试脚本编写
    linux
    linux
    AcWing1131 拯救大兵瑞恩(最短路)
    AcWing341 最优贸易(spfa+dp思想)
    AcWing342 道路与航线(最短路+DAG)
    AcWing340 通信线路
  • 原文地址:https://www.cnblogs.com/caoke/p/13245999.html
Copyright © 2011-2022 走看看