[英]Suffix Array Implementation in Java
我正在寻找一个有效的n阶马尔可夫链方法,在给定一组示例文本的情况下生成随机文本字符串。 我目前有一个使用多层Maps的Java实现,但它很笨重。 后缀数组对于我的需求是完美的,但我不清楚是否可以在Java中有效地实现。
在CI中可能会执行以下操作:
char exampleText[MAX];
char *suffixArray[MAX];
...
while(n<MAX && suffixArray[n++] = &exampleText[n]);
sort(suffixArray);
这得到在Java中粗糙,因为我不得不采取的子exampleText
,或将suffixArray
到索引数组,或别的东西。
有没有在Java中采用这种方法的建议?
String
将[通常]为您执行此操作。 (当使用substring
创建时,典型实现共享后备数组,尽管可能随时更改。)
您可以使用后缀数组制作一些变体:
第一:
public static String[] suffixes(String s)
{
int N = s.length();
String[] suffixes = new String[N];
for (int i = 0; i < N; i++)
suffixes[i] = s.substring(i, N);
return suffixes;
}
第二:
public static String[] suffixes(String s)
{
int N = s.length();
StringBuilder sb = new StringBuilder(s);
String[] suffixes = new String[N];
for (int i = 0; i < N; i++)
suffixes[i] = sb.substring(i, N);
return suffixes;
}
对于任何对在Java中构造后缀数组的更有效方法感兴趣的人,我曾经使用过一个名为jsuffixarrays的库。 代码在这里 。 它提供了一系列构造算法可供选择,我发现它可以很好地工作。 例如,要使用SKEW算法,请执行以下操作:
import org.jsuffixarrays.Algorithm;
import org.jsuffixarrays.ISuffixArrayBuilder;
import org.jsuffixarrays.SuffixArrays;
import org.jsuffixarrays.SuffixData;
String exampleText = "....";
ISuffixArrayBuilder suxBuilder = Algorithm.SKEW.getDecoratedInstance();
SuffixData sux = SuffixArrays.createWithLCP(text,sux_builder);
/* Then, to access the suffix array: */
sux.getSuffixArray();
/* And, to access the LCP array: */
sux.getLCP();
如果不需要,您可以在没有LCP阵列的情况下构建。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.