Java中的后缀数组实现

时间:2010-07-28 04:06:30

标签: java string refactoring suffix-array

我正在寻找一种有效的n阶马尔科夫链方法,在给定一组示例文本的情况下生成随机文本字符串。我目前有一个使用多层Maps的Java实现,但它很笨重。后缀数组对于我的需求是完美的,但我不清楚是否可以用Java有效地实现它。

在C中我可能会做类似的事情:

char exampleText[MAX];
char *suffixArray[MAX];
...
while(n<MAX && suffixArray[n++] = &exampleText[n]);
sort(suffixArray);

由于我必须使用exampleText的子字符串,或者将suffixArray转换为索引数组或其他内容,因此Java中的内容非常粗糙。

有关Java的好方法的任何建议吗?

3 个答案:

答案 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;
}