#include #include #include #include // // Larsson-Sadakane Algorithm // void radixSort_LS(int* S, int Slen, int* SA, int* ISA){ // Treat each element as one digit, execute radix sort, and update ISA. int n = Slen; int m=0; for(int i=0; i r) return; // Exit when the empty range is input. if(l == r){ // Set ISA[SA[l]] to l when the input is singleton. ISA[SA[l]] = l; return; } // Choose a pivot from ISA[SA[]+h]. int v = ISA[SA[l + ((rand()*RAND_MAX+rand())%(r-l+1)) ]+h]; // rand() generates a 2-byte integer at random. RAND_MAX = 32767 = 2^15 - 1. int i = l; int mi = l; int j = r; int mj = r; int tmp; for (;;) { // Compare values according to ISA[SA[]+h] for(; i <= j && ISA[SA[i]+h] <= v; i++) if(ISA[SA[i]+h] == v){ tmp = SA[i]; SA[i] = SA[mi]; SA[mi] = tmp; mi++; } for(; i <= j && v <= ISA[SA[j]+h]; j--) if(ISA[SA[j]+h] == v){ tmp = SA[j]; SA[j] = SA[mj]; SA[mj] = tmp; mj--; } if (i > j) break; tmp = SA[i]; SA[i] = SA[j]; SA[j] = tmp; i++; j--; } for(mi--, i--; l <= mi; mi--, i--){ tmp = SA[i]; SA[i] = SA[mi]; SA[mi] = tmp; } for(mj++, j++; mj <= r; mj++, j++){ tmp = SA[j]; SA[j] = SA[mj]; SA[mj] = tmp; } ternary_split_quicksort_LS(SA, l, i, ISA, h); for(int k = i+1; k < j; k++) ISA[SA[k]] = j-1; // update ISA ternary_split_quicksort_LS(SA, j, r, ISA, h); } int* compute_SA_LS(int* S, int Slen){ // Assume that all elements in S are positive except that the last is zero. int n = Slen; int* SA = new int[n]; int* ISA = new int[n]; // Basic step. radixSort_LS(S, Slen, SA, ISA); //Iterative step. bool iteration; int h=1; do{ iteration = false; int next_i; for(int i=0; i < n; i = next_i){ next_i = ISA[SA[i]]+1; // SA と ISA が下記の ternary_split で更新されるので現在の値を取っておく if(i < ISA[SA[i]]){ // If some blocks are divided. ternary_split_quicksort_LS(SA, i, ISA[SA[i]], ISA, h); // Repeat the while-loop. iteration = true; } } h = h*2; }while(iteration); return(SA); } void generateRandomNumbers(int* target, int targetLen){ // Generate an array in which elements are selected from {1,2,3,4} at random. for(int i=0; i