グラフ内のパスのコンパクトな表現


9

グラフの単純なパスのサブセットがあります。パスの長さはによって制限されます。d

選択したパス以外のパスが表示されないようにパスを表すことができる最もコンパクトな方法(メモリに関して)は何ですか?

このパスのサブセットを何度も繰り返すアルゴリズムでこの表現を使用したいこと、そしてかなり高速にしたいことに注意してください。たとえば、標準の圧縮アルゴリズムは使用できません。

私の頭に浮かんだ表現の1つは、それらを1組の木として表現することでした。それを最適なツリー数に下げるのはNP困難だと思いますか?他にどんな表現が良いでしょうか?


2
「このサブセットを繰り返す」ときに、各パスについてどの情報が必要ですか?長さは?訪問したノード?他のパスとの交差?... 多数存在する可能性があるため、パス全体を保存する必要がある場合は、「それほど高速ではない」ことに備える必要があります。2d
ラファエル

不明なプロセスによってパスが与えられているだけなのかどうかはわかりませんが、興味のあるパスを計算している間に、何らかの簿記を行うことができます。簡単なアイデア:ホストグラフとし、各エッジの重みをゼロに設定します。あなたが興味のパスを見つけるときPを、各辺の重みインクリメントGであるPを。最後に、エッジの重みは、そのエッジが表示されるパスの数を示します。たぶん、最小全域木を計算して、重みがゼロのすべてのエッジ、またはそのようなものをドロップできます。GPGPG
Juho

まあ、2つのエッジの素な単純なパスの結合でもサイクルが作成される可能性があるため、MSTを計算すると、私が推測するパスの1つが失われます。しかし、上記はあなたにいくつかのアイデアを与えるかもしれません。
Juho

2
エップスタインの最短経路に関する論文と関連文献を調べてみてください。コンパクトな表現も扱います。k
Juho

パスを表すためにFSMを使用する可能性がいくつかあり、その後、結合、交差、減算などの基本的な操作を実行できます。また、FSMを最小化する「圧縮」操作はよく理解されており、最適で効率的です。論文でこれが行われたのを見たことはないが、別のやや類似した問題について提案した...
vzn '29

回答:


4

トリーはトリックを行うかもしれません:http : //en.wikipedia.org/wiki/Trie

グラフの各端に文字でラベルを付けます。次に、グラフのパスを表す文字列をトライに追加します。「選択したパス以外のパスは表示されない」という要件を満たすには、トライの頂点をすべて空白のままにし、エッジにラベルを付けることができます。ただし、ルートから頂点につながるエッジがパスの1つを表す場合は、頂点に何かのラベルを付けます。ブール値、ある順序でのパスの数など。

トライを構築したら、それを最適な(または最適に近い)表現に圧縮するアルゴリズムがあります。(リンクされているウィキペディアの記事を参照してください。)


面白い。ただし、トライには、私があまり気にしないはるかに大きな仕様のセットが含まれているため(クイックルックアップ、キーとの関連付けなど)、より良いものが可能かどうか疑問に思います...
Opt

2

おそらく、簡潔なデータ構造を確認する必要があります。それらは、情報理論上の下限に近い空間に情報を格納しようとするデータ構造であり、それらに対して操作を実行する能力を維持します。

木や辞書などには、このような構造があります。私が思い通りに実行できる構造は覚えていませんが、おそらくそれらの組み合わせや修正が役立つでしょう。


1

アルゴリズムに必要な複雑さと前処理/後処理に応じて、おそらく最も単純なオプションが方法です。それらを配列として簡単に表現し、HDF5で圧縮して保存できます。このライブラリにはいくつかの高速圧縮アルゴリズムが搭載されているため、圧縮データの読み取りと書き込みは非圧縮よりもさらに高速になる場合があります。

ここにいくつかのプロットがあります:

15 GBのEArrayとさまざまなチャンクサイズの要素ごとのシーケンシャルアクセス時間: http://pytables.github.io/_images/seq-chunksize-15GB.png

PyTablesでBloscを使用した解凍速度: ここに画像の説明を入力してください

そして、それらが長さで囲まれている場合は、それらをテーブルに格納して、おそらくもう少しスペースを増やすことができます。そして、それらをメモリから取得するとき、アルゴリズムを適用するのに非常に便利な形式になっています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.