2012-03-20 85 views
2

比方說,我有字符串"Hey"。我想確定此字符串中存在的字符的所有組合,儘可能快地使用快速。得到的算法應該產生這樣的:確定現有字符串的所有子字符串的最快方法

H, e, y, He, ey, Hey 

,因爲它字符串作爲一個子中存在的算法應該產生串"Hy"

+3

它爲什麼要快?一個簡單的雙循環解決方案似乎對我來說足夠快... – wildplasser 2012-03-20 17:35:32

+0

HeyHeyHey的答案是什麼?它會有3'嘿或只有一個? – ElKamina 2012-03-20 17:36:09

+0

@wildplasser:從算法的角度來看,您提出的建議似乎是最快的解決方案。 – 2012-03-20 17:38:23

回答

3

還有那些子的O(n^2),長度[1,n]的,所以任何算法生成個個將是O(n^2) * O(n) = O(n^3)

(*)查看EDIT2末 - 取決於弦的實施 - 複雜性可以改變從O(n^2)O(n^3)

僞代碼:

result <- {} #result is a set if dupes should be terminated, otherwise - it is a multiset. 
for i from 0 to s.length: 
    for j from i+1 to s.length: 
     result.add(s.substring(i,j)) 
return result 

不過請注意,TH你可以做一些「作弊」,通過創建一個迭代器和動態生成的字符串,它應該是這個樣子[僞代碼]:

class MyIterator: 
    String s 
    int i,j 
    MyIterator(String s): 
    this.s = s 
    i = 0 
    j = 0 
    next(): 
    j = j + 1 
    if (j >= s.length): 
    i = i + 1 
    j = i + 1 
    if (i >= s.length): 
     throw exception 
    return s.substring(i,j) 

注意,創建迭代器O(1),並且每次迭代是O(n) - 但要真正生成所有元素,您需要O(n^2)步驟,因此複雜性總體上仍然爲O(n^3),但您可以減少應用程序的延遲。

編輯:
我editted複雜,聲稱這是O(n^2)是錯誤的,複雜O(n^3)因爲你需要生成可變長度的字符串,其中有些是長。至少一半的生成的子串的將是長n/2的 - 因此總的複雜性爲Theta(n^3)

EDIT2:
在某些情況下,它實際上可以O(n^2) - 取決於字符串實現。在java中的例子 - 它使用一個單一的char[],只有「中扮演」與offsetlength - 所以在Java中 - 創作其實是O(n^2),因爲創建一個字符串是O(1)
在C然而 - 這是O(n^3),因爲每個子需要複製到不同的char[]

+0

第二次編輯如何應用於PHP? – 2012-03-20 17:56:19

+0

@TylerJohnson:我不熟悉php我害怕,我不知道如何在php中創建子字符串,但AFAIK大多數現代語言不需要複製字符串,但它只是一個猜測。 – amit 2012-03-20 17:59:39

0

在php中檢查n-gram的實現。

在您的例子字符串:嘿

H,E,Y是對unigram

HE,EY是二元語法

HEY是三元

+0

也許php對n-gram有其他含義,但[n-grams](http://en.wikipedia.org/wiki/N-gram)通常被稱爲術語/單詞。 1個字是unigram,2個字是bigram,3個字是trigram,...例如:[google n-grams](http://googleresearch.blogspot.com/2006/08/all-our-n-gram- are-belong-to-you.html) – amit 2012-03-20 20:09:56

+0

嗨阿米特:NGrams可能暗示了字或字。我不用PHP代碼,我一般採取。我在Lucene搜索引擎中使用NGram索引來分割單詞。它也可以是術語/單詞或字符。 – Yavar 2012-03-21 04:43:57

相關問題