2012-05-31 3 views
5

私は、クライアント間で共有されるアクティビティのキューを持ち、ユーザのアクティビティをキャプチャし、他のサイトのロボットによって実行されます。活性物質の例は、以下のようなものであってもよい:キューの削減アルゴリズムですか?

CREATE FOLDER /docs 
CREATE FILE /docs/journal.txt 
DELETE FILE /docs/blog.txt 
MOVE FOLDER /docs/images /docs/photos 
... 

しばしば1つに減らすことができる活性物質が存在するか、または全く存在しない。例えば:

CREATE FOLDER /docs 
RENAME FOLDER /docs /documents 

は単純に変更することができます:

CREATE FOLDER /documents 

など何か:

CREATE FOLDER /docs 
RENAME FOLDER /documents 
DELETE FOLDER /documents 

は、キューから完全に削除することができます。

このような削減/最適化は非常に一般的な問題のようですが、攻撃する前にいくつかの一般的な解決策を試してみたいと思います。これは、経路探索最適化問題のように見えます。

アイデア?

答えて

2

これを行うライブラリやフレームワークについてよくわかりません。一方で、あなた自身の背後にあるロジックを指定しなければならないでしょう。そして、私が見ているように、それはとにかく仕事の大部分になります。

ここで私はかかるだろうなアプローチです:

  1. は、アクションのトポロジカルソートを行います(フォルダの名前を変更するようにフォルダを作成し、「依存する」...)

  2. 各コマンドなしで依存関係は、依存関係ツリーの「ルート」を表します。

  3. これらのツリーを各ルートから再帰的に折りたたみます。 (ややヘビー級1はあるが)

+0

私は本当にライブラリを探していませんが、もしあれば、私は幸せになるでしょう。あなたは「木を崩壊させる」ことが何を意味するのかを明確にすることはできますか? –

1

1つのオプションは、キューレコード上を歩くと、あなたがプログラム内で作成ツリー表現上のファイルシステム上で実行される操作をシミュレートすることです。参照されている各ディレクトリについて、どのようなネット操作が実行されるのかを追跡できます。完了したら、変更されたツリー構造の上を歩み、各ディレクトリとサブディレクトリに適用されるネット変換を表す一連のコマンドを出力できます。

希望すると便利です。

0
  1. は、操作のためのあなたの操作+パラメータが含まれていCommandクラスを定義し、あなたのすべての操作(作成、名前の変更、移動)
  2. を定義します。
  3. 2つのコマンドを組み合わせることができるかどうか、またその組み合わせの結果とは何かを示すものを実装します。

お互いの直後にあるコマンドだけを組み合わせることができないとか、望ましくない副作用を招く可能性があると仮定する必要があります。だからあなたがyoruキューからコマンドを実行するときは、それに結合できないコマンドが出てくるまで、覗き見/ポッピング/ビルドを開始します。

+0

良いことをありがとう、しかし私はあなたが問題を理解していないと思う。まず、実装の詳細は関係ありません、私はちょうどアルゴリズムを探しています。第二に、コマンドが必ずしも隣接しているとは限りません。したがって、あなたが提案するものはうまくいかず、n * nの検索を要求します。私がそれを喜んで受け入れるならば、より明白な解決法があります。 –

+0

あなたがop要素の結果によってn個の要素に一致するO(n)またはO(1)の方法を見つけたら、非常に驚​​くでしょう(op = areTheyCombinable?)。私の実装の詳細からアルゴリズムを取り出してください。コードスナップショットを手伝ってくれました。幸運にも、この魔法の解決策が見つかると嬉しいです。 – csauve

+1

また、望ましくない副作用を招くことなく、キュー内のアイテムを並べ替えることができると考える方法を説明してください。例えば、1 = CreateFile(A、 "ちょっとあなた!")、2 = SendEmail([email protected]、ContentsOf(A))、3 = DeleteFile(A)。あなたが本当に#1と#3を組み合わせることができれば(定義によって)#2を破ります。 – csauve