比方說,我有字符串"Hey"
。我想確定此字符串中存在的字符的所有組合,儘可能快地使用快速。得到的算法應該產生這樣的:確定現有字符串的所有子字符串的最快方法
H, e, y, He, ey, Hey
,因爲它不字符串作爲一個子中存在的算法應該不產生串"Hy"
。
比方說,我有字符串"Hey"
。我想確定此字符串中存在的字符的所有組合,儘可能快地使用快速。得到的算法應該產生這樣的:確定現有字符串的所有子字符串的最快方法
H, e, y, He, ey, Hey
,因爲它不字符串作爲一個子中存在的算法應該不產生串"Hy"
。
還有那些子的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[]
,只有「中扮演」與offset
和length
- 所以在Java中 - 創作其實是O(n^2)
,因爲創建一個字符串是O(1)
在C然而 - 這是O(n^3)
,因爲每個子需要複製到不同的char[]
。
第二次編輯如何應用於PHP? – 2012-03-20 17:56:19
@TylerJohnson:我不熟悉php我害怕,我不知道如何在php中創建子字符串,但AFAIK大多數現代語言不需要複製字符串,但它只是一個猜測。 – amit 2012-03-20 17:59:39
在php中檢查n-gram的實現。
在您的例子字符串:嘿
H,E,Y是對unigram
HE,EY是二元語法
HEY是三元
也許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
嗨阿米特:NGrams可能暗示了字或字。我不用PHP代碼,我一般採取。我在Lucene搜索引擎中使用NGram索引來分割單詞。它也可以是術語/單詞或字符。 – Yavar 2012-03-21 04:43:57
它爲什麼要快?一個簡單的雙循環解決方案似乎對我來說足夠快... – wildplasser 2012-03-20 17:35:32
HeyHeyHey的答案是什麼?它會有3'嘿或只有一個? – ElKamina 2012-03-20 17:36:09
@wildplasser:從算法的角度來看,您提出的建議似乎是最快的解決方案。 – 2012-03-20 17:38:23