Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 后缀数组构造_Java_Arrays_Suffix Array - Fatal编程技术网

Java 后缀数组构造

Java 后缀数组构造,java,arrays,suffix-array,Java,Arrays,Suffix Array,我正在从中学习后缀数组的构造 这是我从C++移植到java 的代码 class Entry implements Comparable<Entry> { int [] nr = new int[2]; int p=0; public int compareTo(Entry that){ if (this.nr[0] == that.nr[0]){ if(this.nr[1] < that.nr[1]){

我正在从中学习后缀数组的构造

这是我从C++移植到java

的代码
class Entry  implements Comparable<Entry> {

    int [] nr = new int[2];
    int p=0;

    public int compareTo(Entry that){
        if (this.nr[0] == that.nr[0]){
            if(this.nr[1] < that.nr[1]){
                return 1;
            }else{
                return 0;
            }
        }else if(this.nr[0]<that.nr[0]){
            return 1;
        }else{
            return 0;
        }
    }
}

public class SuffixArray {

    private static final int MAXN = 65536;
    private static final int MAXLG = 17;

    private static Entry [] entries = new Entry[MAXN];
    private static int [][] matrix = new int [MAXLG] [MAXN];

    private static int step=0, count=0;
    private static int N=0;

    public static void process(String S) {

        N = S.length();
        for(int i=0;i<N;i++){
            matrix[0][i] =  (S.charAt(i)-'a');
        }
        for(int i=0;i<N;i++){
            entries[i] = new Entry();
        }

        for(step=1,count=1; (count>>1)<N;step++, count<<=1){
            for(int i=0;i<N;i++){
                entries[i].nr[0] = matrix[step-1][i];                
                entries[i].nr[1] = 
                    i + ((count<N) ? matrix[step-1][i+count] : -1) ;
                entries[i].p=i;
            }               
           Arrays.sort(entries, 0, N, new EntryComparator());
           for(int i=0;i<N;i++){
              matrix[step][entries[i].p]=i;           
              if(i>0  
                  && entries[i].nr[0]== entries[i-1].nr[0]        
                  && entries[i].nr[1]==entries[i-1].nr[1]) {
                 matrix[step][entries[i].p]= matrix[step][entries[i-1].p];
              }
           }
        }         
    }

    public static void main(String[] args) {

        String S ="mississippi";
        process(S);
    }
类条目实现了可比较的{
int[]nr=新的int[2];
int p=0;
public int compareTo(该条目){
if(this.nr[0]==that.nr[0]){
if(this.nr[1]}else if(this.nr[0]经过大量调试,我得到了答案。
粘贴我为查找后缀数组而编写的代码:

class Entry  implements Comparable<Entry> {

    int [] nr = new int[2];
    int p=0;

    public int compareTo(Entry that){

        if(this.nr[0] == that.nr[0]) {
            if (this.nr[1] < that.nr[1]) {
                return -1;
            } else {
                return 0;
            }
        }else if (this.nr[0] < that.nr[0] ) {
            return -1;
        } return  0;
    }

}

public class SuffixArray {

    private static final int MAXN = 65536;
    private static final int MAXLG = 17;

    private static Entry [] entries = new Entry[MAXN];
    private static int [][] matrix = new int [MAXLG] [MAXN];

    private static int step=0, count=0;
    private static int N=0;

    public static void process(String S) {

        N = S.length();
        for(int i=0;i<N;i++){
            matrix[0][i] =  (S.charAt(i)-'a');
        }

        for(int i=0;i<MAXLG;i++){
            entries[i] = new Entry();
        }

        for(step=1,count=1; (count>>1)<N;step++, count<<=1) {

            for(int i=0;i<N;i++){
                entries[i].nr[0] = matrix[step-1][i];
                entries[i].nr[1] = (i+count<N)  ? matrix[step-1][i+count] : -1 ;                 
                entries[i].p=i;
            }

            Arrays.sort(entries,0,N);

            for(int i=0;i<N;i++){
                matrix[step][entries[i].p]=i;
                if(i>0 
                    && entries[i].nr[0]== entries[i-1].nr[0] 
                    && entries[i].nr[1]==entries[i-1].nr[1]) {                     
                    matrix[step][entries[i].p]= matrix[step][entries[i-1].p];
                }
            }
        }
    }

    public static void main(String[] args) {
        String S ="banana";
        process(S);
    }
}
类条目实现了可比较的{
int[]nr=新的int[2];
int p=0;
public int compareTo(该条目){
if(this.nr[0]==that.nr[0]){
if(this.nr[1]