Skip to content

Commit 34bf618

Browse files
author
uwi
committed
WIP on improve-sa: c13664f MathLibrary
3 parents c13664f + ca94592 + 10a92d1 commit 34bf618

1 file changed

Lines changed: 28 additions & 20 deletions

File tree

‎StringAlgorithm/StringAlgorithm.java‎

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,66 @@
1+
import java.util.stream.IntStream;
2+
13
class StringAlgorithm {
24
private static int[] saNaive(int[] s) {
35
int n = s.length;
4-
Integer[] _sa = new Integer[n];
5-
for (int i = 0; i < n; i++) {
6-
_sa[i] = i;
6+
int[] sa = new int[n];
7+
for(int i = 0;i < n;i++){
8+
sa[i] = i;
79
}
8-
java.util.Arrays.sort(_sa, (l, r) -> {
10+
insertionsortUsingComparator(sa, (l, r) -> {
911
while (l < n && r < n) {
1012
if (s[l] != s[r]) return s[l] - s[r];
1113
l++;
1214
r++;
1315
}
1416
return -(l - r);
1517
});
16-
int[] sa = new int[n];
17-
for (int i = 0; i < n; i++) {
18-
sa[i] = _sa[i];
19-
}
2018
return sa;
2119
}
2220

23-
private static int[] saDoubling(int[] s) {
21+
public static int[] saDoubling(int[] s) {
2422
int n = s.length;
25-
Integer[] _sa = new Integer[n];
26-
for (int i = 0; i < n; i++) {
27-
_sa[i] = i;
23+
int[] sa = new int[n];
24+
for(int i = 0;i < n;i++){
25+
sa[i] = i;
2826
}
2927
int[] rnk = s;
3028
int[] tmp = new int[n];
3129

3230
for (int k = 1; k < n; k *= 2) {
3331
final int _k = k;
3432
final int[] _rnk = rnk;
35-
java.util.Comparator<Integer> cmp = (x, y) -> {
33+
java.util.function.IntBinaryOperator cmp = (x, y) -> {
3634
if (_rnk[x] != _rnk[y]) return _rnk[x] - _rnk[y];
3735
int rx = x + _k < n ? _rnk[x + _k] : -1;
3836
int ry = y + _k < n ? _rnk[y + _k] : -1;
3937
return rx - ry;
4038
};
41-
java.util.Arrays.sort(_sa, cmp);
42-
tmp[_sa[0]] = 0;
39+
insertionsortUsingComparator(sa, cmp);
40+
tmp[sa[0]] = 0;
4341
for (int i = 1; i < n; i++) {
44-
tmp[_sa[i]] = tmp[_sa[i - 1]] + (cmp.compare(_sa[i - 1], _sa[i]) < 0 ? 1 : 0);
42+
tmp[sa[i]] = tmp[sa[i - 1]] + (cmp.applyAsInt(sa[i - 1], sa[i]) < 0 ? 1 : 0);
4543
}
4644
int[] buf = tmp;
4745
tmp = rnk;
4846
rnk = buf;
4947
}
48+
return sa;
49+
}
5050

51-
int[] sa = new int[n];
52-
for (int i = 0; i < n; i++) {
53-
sa[i] = _sa[i];
51+
private static void insertionsortUsingComparator(int[] a, java.util.function.IntBinaryOperator comparator) {
52+
final int n = a.length;
53+
for (int i = 1; i < n; i++) {
54+
final int tmp = a[i];
55+
if (comparator.applyAsInt(a[i - 1], tmp) > 0) {
56+
int j = i;
57+
do {
58+
a[j] = a[j - 1];
59+
j--;
60+
} while (j > 0 && comparator.applyAsInt(a[j - 1], tmp) > 0);
61+
a[j] = tmp;
62+
}
5463
}
55-
return sa;
5664
}
5765

5866
private static final int THRESHOLD_NAIVE = 10;

0 commit comments

Comments
 (0)