文字列が"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
注ただし、目
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)
のままですが、アプリケーションの待ち時間は短くなります。
EDIT:
私は、あなたが変数の長さの文字列を生成する必要があるため、複雑でO(n^3)
あり、そのうちのいくつかが長いことがO(n^2)
が間違っていると主張し、複雑さをeditted。生成されたサブストリングの少なくとも半分の長さn/2
であろう - こうして総複雑性はEDIT2 Theta(n^3)
ある: - 文字列の実装に依存
いくつかのケースでは、それは実際O(n^2)
することができます。例えば、Javaで - それは、単一のchar[]
を使用し、唯一のoffset
とlength
で「演じる」 - Javaでて - それは、すべてのサブ以来、O(n^3)
ある - サブストリングを作成することがCでO(1)
あるので、作成は、実際にO(n^2)
です異なるchar[]
にコピーする必要があります。
2回目の編集はどのようにPHPに当てはまりますか? –
@TylerJohnson:私はPHPに精通していません私は恐れています、私はどのように部分文字列がPHPで作成されているのかわかりませんが、現代の最も現代的な言語のAFAIK文字列をコピーする必要はありません。 – amit
phpでnグラムの実装を確認してください。あなたの例の文字列で
:ねえ
H、E、Yユニグラムある
HE、EYはバイグラム
あるHEY、なぜそれが高速であることが必要トライグラム
PHPはnグラムには他の意味があるかもしれませんが、[n-grams](http://en.wikipedia.org/wiki/N-gram)は通常、用語/単語として参照されます。 1ワードはユニグラム、2ワードはバイグラム、3ワードはトリグラムなど... [google n-grams](http://googleresearch.blogspot.com/2006/08/all-our-n-gram- are-belong-to-you.html) – amit
こんにちはAmit:NGramsは言葉や文字を暗示することがあります。私はPHPでコードを書いていない、私は一般的に取っています。私は単語を分割するためにLucene検索エンジンでNGram Indexingを使用します。それはまた、用語/単語または文字でもあり得る。 – Yavar
のですか?些細な2ループの解決策は私には十分に速いようです... – wildplasser
HeyHeyHeyの答えは何ですか?それは3 'ヘイのものか、それとも単なるものか? – ElKamina
@wildplasser:あなたが提案するものは、アルゴリズム的な観点から、可能な限り速い解決策のようです。 –