16

何百万ものノードがあるグラフのドミネーター ツリーを計算するために、Lengauer および Tarjan アルゴリズムとパス圧縮を使用しています。アルゴリズムは非常に複雑であり、完全に理解するのに時間がかかっていないことを認めなければなりません。使用しているだけです。ここで、ルート ノードの直接の子のドミネーター ツリーを計算し、この操作を繰り返して特定の深さまでグラフを再帰する必要があります。つまり、ルート ノードの子のドミネーター ツリーを計算するときに、ルート ノードがグラフから削除されたふりをしたいのです。

私の質問は、ルート ノードの初期ドミネーター ツリーで既に計算されている即時ドミネーター情報を利用する効率的な解決策があるかどうかです。言い換えれば、プロセス全体が非常に時間がかかるため、子供たちのそれぞれについてゼロから始めたくありません。

単純に、グラフの奥深くには、idom が少し上にあり、グラフの上部の変更の影響を受けないノードがたくさんあるため、それは可能であると思われます。

ところで、ドミネーターツリーの主題がコンパイラーの人々によって「所有」されており、古典的なグラフ理論に関する本でそれについて言及されていないのは奇妙です。私が使用しているアプリケーション (私の FindRoots Java ヒープ アナライザー) は、コンパイラ理論とは関係ありません。

明確化: ここでは有向グラフについて話しています。私が参照する「ルート」は、実際には最大の到達可能性を持つノードです。「ツリー」への参照を「グラフ」に置き換えて、上記のテキストを更新しました。形が主に木のような。グラフは実際には Java ヒープ内のオブジェクトであり、ご想像のとおり、適度に階層化されています。OOM リーク分析を行う際にドミネーター ツリーが役立つことが分かりました。答えは最終的にそのドミネーターです。ドミネーター ツリーを使用すると、木ではなく木を<ahem>見ることができます。しかし、時にはたくさんのがらくたが木のてっぺんに浮かぶので、そのすぐ下に何千もの子を持つ根があります。このような場合、ルートの (元のグラフの) 直接の子のそれぞれにルートを持つドミネーター ツリーの計算を試してから、1 つ下のレベルに移動します。(当分の間、バックリンクの可能性について心配しないようにしています:)

4

4 に答える 4

6

boost::lengauer_tarjan_dominator_tree_without_dfs役立つかもしれません。

于 2008-10-31T09:07:02.997 に答える
3

コメントが不足していることから判断すると、Stackoverflow には関連する経験を持っている人があまりいないと思います。私もその一人なのですが、こんな面白い質問をドタバタで終わらせたくないので、力を貸してあげたいと思います。

私の最初の考えは、このグラフが他のコンパイラによって生成された場合、GCC などのオープンソース コンパイラを調べて、この問題がどのように解決されるかを確認する価値があるのではないかということです。

私の2番目の考えは、あなたの質問の主なポイントは、ツリーのルートの結果を再計算することを避けているように見えるということです。

私がすることは、ノード自体とそのノードに関連付けられた事前計算されたデータを含む各ノードの周りにラッパーを作成することです。その後、これらのラッパー クラスを使用して、古いツリーから新しいツリーが再帰的に再構築されます。このツリーを構築するときは、ルートから始めて、リーフ ノードに向かって進んでいきます。ノードごとに、これまでのすべての祖先の計算結果を保存します。そうすれば、新しいノードの値を計算するために処理している親ノードと現在のノード データを確認するだけで済みます。

それが役立つことを願っています!

于 2008-10-30T16:11:25.603 に答える
1

どのような種類のグラフから始めているか詳しく説明していただけますか? ツリーであるグラフと、そのグラフのドミネーター ツリーとの間にどのような違いがあるのか​​ わかりません。すべてのノードの親はその IDOM である必要があり、もちろん、ツリー内でその上位にあるすべてのものによって支配されます。

于 2008-10-30T20:53:23.600 に答える
0

私はあなたの質問を完全には理解していませんが、増分更新機能が必要なようです。私は少し前に彼らのアルゴリズムが何であるかを調査しましたが、大きなグラフがこれを迅速に行う既知の方法がないように思えました (少なくとも理論的な観点から)。

「インクリメンタル アップデート ドミネーター ツリー」を検索するだけで、参考文献を見つけることができます。

Eclipse メモリ アナライザーがドミネーター ツリーを使用していることはご存知かと思いますが、このトピックはもはやコンパイラー コミュニティによって完全に「所有」されているわけではありません :)

于 2009-02-18T10:27:55.600 に答える