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]