2010-07-28 83 views
1

我正在尋找一個有效的n階馬爾可夫鏈方法來生成給定一組示例文本的隨機文本字符串。我目前有一個使用幾層地圖的Java實現,但它很笨拙。後綴數組對於我的需求來說是完美的,但我不清楚它是否可以在Java中有效地實現。在Java中後綴數組實現

在C我可能會做這樣的事情:

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

這在Java中變得粗糙,因爲我不得不採取的exampleText子,或轉成suffixArray指數的數組,或別的東西。

有關在Java中使用此方法的任何建議嗎?

回答

2

String將[通常]爲您做到這一點。 (當與substring創建典型實現共享背襯陣列,儘管這是可能隨時發生變化。)

+0

謝謝你,我還沒有想過嘗試一下出。我只是假設它會爆炸。 – Rich 2010-07-28 14:36:52

+3

不再。自從Java 7開始執行復制以來,所以最好編寫自己的包裝器 – 2013-09-30 09:13:35

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陣列進行構建。

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