我正在嘗試查找給定字符串中的所有子字符串。對於像rymis
這樣的隨機字符串,子序列將是[i, is, m, mi, mis, r, ry, rym, rymi, rymis, s, y, ym, ymi, ymis]
。從Wikipedia開始,長度爲n
的字符串將總共具有n * (n + 1)/2
個子字符串。Java中的字符串子串生成
這可以通過執行下面的代碼片段中找到:
final Set<String> substring_set = new TreeSet<String>();
final String text = "rymis";
for(int iter = 0; iter < text.length(); iter++)
{
for(int ator = 1; ator <= text.length() - iter; ator++)
{
substring_set.add(text.substring(iter, iter + ator));
}
}
這對於小字符串長度的作品,但明顯放緩的大長度的算法是近O(n^2)
。
也閱讀後綴樹,它可以在O(n)
插入,並注意到相同的子序列可以通過從右邊刪除1個字符重複插入子字符串直到字符串爲空來獲得。這應該是關於O(1 + … + (n-1) + n)
這是一個summation of n
- >n(n+1)/2
- >(n^2 + n)/ 2
,這又是接近O(n^2)
。雖然似乎有一些後綴樹可以在log2(n)
時間插入,這將是一個更好的因素O(n log2(n))
。
在我深入研究後綴樹之前,這是一條正確的路線,是否有另一種算法對此更有效率,或者是O(n^2)
就好了?
這功課嗎? – 2012-02-22 19:12:54
由於該集合包含n *(n + 1)/ 2個值,因此您必須對該集合執行n *(n + 1)/ 2個插入操作,所以我沒有看到算法如何小於O (N^2)。 – 2012-02-22 19:15:10
@JBNizet - 我同意,沒有辦法避免觸及每個子串元素。由於原始集合的大小爲n,並且大約有n^2個元素要訪問,所以最有可能無法提高效率。 – 2012-02-22 19:28:14