我正在寻找一种有效的n阶马尔科夫链方法,在给定一组示例文本的情况下生成随机文本字符串。我目前有一个使用多层Maps的Java实现,但它很笨重。后缀数组对于我的需求是完美的,但我不清楚是否可以用Java有效地实现它。
在C中我可能会做类似的事情:
char exampleText[MAX];
char *suffixArray[MAX];
...
while(n<MAX && suffixArray[n++] = &exampleText[n]);
sort(suffixArray);
由于我必须使用exampleText
的子字符串,或者将suffixArray
转换为索引数组或其他内容,因此Java中的内容非常粗糙。
有关Java的好方法的任何建议吗?
答案 0 :(得分:2)
String
[通常]将为您执行此操作。 (使用substring
创建时,典型实现共享后备阵列,尽管可能随时更改。)
答案 1 :(得分:1)
对于那些对使用Java构建后缀数组的更有效方法感兴趣的人,我曾经使用过一个名为jsuffixarrays的库。代码是here。它提供了一系列构造算法可供选择,我发现它可以很好地工作。例如。要使用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阵列的情况下进行构建。
答案 2 :(得分:1)
您可以使用后缀数组制作一些变体:
<强>首先强>
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;
}