4

私はカスタムイテレータを持っています(正確にはTokenIteratorで、トークン化されたphpコードを繰り返します)。アイテムは単純なオブジェクトです(いくつかの正規化メソッドが追加された「プロパティバッグ」)

検索機能を実装する必要があります。これは、1。1つのイテレーターに別のイテレーターが含まれているか2. 2つ(またはそれ以上)のイテレーターが重複しているか(パラメーターがいくらかあるか)を検出する必要があります。

現在、私は(1)-O(NxM)ダブルループ検索にナイーブなアプローチを使用していますが、(2)はまだ実装されていません。

本当にスマートな文字列検索アルゴリズムの再実装を開始する前に、その効果的な実装が存在するかどうかを知りたいですか?たぶん、再利用するために何かがフレームワークやジェネリックライブラリの奥深くに埋もれているのでしょうか?そして、どのアルゴリズムがここで最も適しているでしょうか?

4

2 に答える 2

3

最初に頭に浮かぶのは、イテレータが最善の解決策ではないことは間違いない、集合演算について話しているということです。

あなたの問題に対する既存の解​​決策があるかどうかはわかりませんが、一般的な解決策として、ハッシュテーブルを使用します。たとえば、最初のセットのトークンを使用してハッシュテーブルを作成し(Iteratorは最適な単語ではないと思うので、これからセットと呼びます)、Theta(N)でそれを実行してから、同じハッシュテーブルに他のセットを挿入します。初めて衝突したときは、オーバーラップがあることがわかります。もちろん、これはハッシュスペースが広く、ハッシュ関数が無視できる量の衝突を保証する場合にうまく機能しますが、何らかの回避策をコーディングすることは常に可能です。

PHPに連想配列(ハッシュテーブルの形式)がある場合、トークンをキーとして持つ配列を作成することもできます。これもTheta(N)で実行でき、array_key_existsを使用できます。PHPの内部に精通していないため、array_key_existsがキーのリストの線形スキャンにすぎない可能性は絶対にありますが、連想配列をハッシュテーブルとして実装する場合は、さらに多くの機能を実装する必要があると確信しています。線形スキャンよりも効率的です。

于 2010-12-27T00:15:42.240 に答える
1

イテレータを配列にキャストできる場合は、とを使用できarray_diffますarray_intersect。それ以外の場合は、これらの関数が内部で行うことを実装する必要があります。構造を調べて比較します。反復するデータは並べ替えられておらず、それについて他に何も知らないため、他に選択肢はありません。

于 2010-12-24T10:01:53.177 に答える