重み付きDAGが与えられた場合、各重みをその祖先の重みの合計で置き換えるO(V + E)アルゴリズムはありますか?


34

もちろん、問題は二重カウントです。特定のクラスのDAG =ツリー、またはシリアル/パラレルツリーでさえも簡単に実行できます。妥当な時間で一般的なDAGで機能する唯一のアルゴリズムは近似アルゴリズム(Synopsis拡散)ですが、その精度の向上はビット数で指数関数的です(そして多くのビットが必要です)。

背景:このタスクは、BBChop(http://github.com/ealdwulf/bbchop)の確率計算の一部として、断続的なバグを見つけるためのプログラム(つまり、「ベイズバージョン」 git bisect ')。したがって、問題のDAGは改訂履歴です。つまり、エッジの数がノードの数の2乗に近づく可能性は低く、小さなkの場合、ノードの数のk倍未満になる可能性が高いことを意味します。残念ながら、リビジョンDAGの他の有用なプロパティは見つかりませんでした。たとえば、最大のトライコネクテッドコンポーネントがノード数の平方根としてのみ成長することを期待していましたが、悲しいことに(少なくともLinuxカーネルの歴史では)線形に成長します。


明確にするために、エッジではなく、重みを持つのはノードだけですか?
ハインリッヒアプフェルムス

はい、ノードだけです。
イールドゥル


これは実際にはより一般的なようです。ユニットの重みをすべての頂点に割り当てると、この問題が到達可能性の問題に減少するためです。
スレシュヴェンカト

近似は、いくつかの余分なpolylog因子と行うのは難しいのではないようです...
サリエルのHar-Peled

回答:


17

頂点の重みは任意の正の整数、またはより正確には最大2 nの正の整数にできると仮定します。次に、任意の有向グラフの推移閉包をO(n 2)時間で計算できる場合を除き、現在のタスクはわずかに弱い時間境界O(n 2)でも実行できません。ここで、nは頂点の数を示します。(推移的閉包のためのO(n 2)時間アルゴリズムはブレークスルーになることに注意してください。)これは、次の主張の反対です:

請求。現在のタスクを時間O(n 2)で実行できる場合、その隣接行列として与えられた任意の有向グラフの推移閉包をO(n 2)時間で計算できます(合理的な計算モデルを想定)。

証明。前処理として、与えられた有向グラフGの時間O(n 2)の強連結成分分解を計算して、DAG G ' を取得します。我々はの推移閉包計算することができるかどうかという注意G "を、私たちはの推移閉包再構築することができますGを

ここで、重み2 iをDAG G 'の各頂点iに割り当て、現在の問題のアルゴリズムを使用します。各頂点に割り当てられた合計のバイナリ表現iはの祖先の正確セット説明私は、換言すれば、我々は、の推移閉包計算したGを '。 QED

クレームの逆も成り立ちます。特定のDAGの推移閉包を計算できる場合、時間O(n 2)を追加することで必要な合計を簡単に計算できます。したがって、理論的には、Coppersmith-Winograd行列乗算アルゴリズムに基づく推移的閉包のアルゴリズムを使用することで、時間O(n 2.376)で現在のタスクを達成できます

編集:リビジョン2以前では、頂点の重みの範囲に関する仮定を明示的に述べていませんでした。Per Vognsenはコメントでこの暗黙の仮定は合理的ではないかもしれないと指摘しました(ありがとう!)、そして私は同意します。アプリケーションで任意の重みが必要でない場合でも、この答えは次の推論の行によっていくつかのアプローチを除外する可能性があると思います:「このアプローチが機能する場合、任意の重みのアルゴリズムを与えます閉包は時間O(n 2)で計算できます。」

編集:リビジョン4以前では、エッジの方向が誤って記載されていました。


4
昨夜、私はこのまさにことについて考えていました。なぜなら、1つの実用的な解決策はビットベクトルを使用して除外カウントを行うからです。唯一の問題は、重みがnに比例するビット長を持つことができると仮定するのが妥当かどうかだと思います。実際には、重みがkによって制限されているため、可能な最大の合計がknであると想像できます。これは、このトリックを引き出すのに十分なビットではありません。
Per Vognsen

@Per:頂点の重みがnビット整数であるという仮定には疑問があるかもしれないことに同意します。この仮定を明確にするために答えを編集しました。ありがとう!
伊藤剛

1
@Per:頂点の重みがO(1)で区切られた整数である場合、適切な方法で頂点を複製することにより、すべての頂点の重みが1の場合に問題が減少することに気付きました。
伊藤剛

残念ながら、そのスレッドにはカウントの問題に対する答えがありません。カウントには、推移閉包のリストO(n log n)対O(n ^ 2)よりも対数的に少ない情報が含まれているため、単純な簡約がどのように機能するかわかりません。
Per Vognsen

ところで、この問題の興味深いバージョンは、DAGの世代(トポロジカルな並べ替え)のサイズの増加に関する分岐係数と情報に関する限界がある場合です。成長が指数関数的である場合、パターンは本質的にツリーのようなものです。線形、対数線形、二次などの場合はどうなりますか?
Per Vognsen

2

これは、剛の答えに対する私のコメントの拡大です。質問に対する否定的な答えは無条件にできると思います。

ω(n)O(n)

Gr,cr×crrc

r=(log n)/2c=2n/log n

nω(log n)

ω(n)2c(r1)=O(n)

ポイントは、基礎となる半順序が密であるように見えますが、DAGはその推移的な減少を表しており、これはまばらになります。


この議論は興味深いものですが、それを興味深い声明の証拠にすることができるかどうかはわかりません。問題の下限を証明することが広範に困難であることを考えると、この議論は私にとっては手荒いように思えます。
伊藤剛

@Tsuyoshi:存在は確率論的議論を介して機能するはずであり、下限は弱いので、機能するのに十分なスペースがあるようです。しかし、あなたは正しいです。それは「平均的には再利用できない追加」というフレーズには、より良い基盤が必要です。
アンドラスサラモン

-2

これは間違っており、質問に対する誤解に基づいています。 私のエラーを辛抱強く指摘してくれた剛に感謝します。他の人が同じ間違いを犯した場合に備えて、離れます。

k

kO(k|V|)

O(|V|+|E|)

このアプローチは、比較的頻繁ではない限り、多くの直近の先行ノードがあるノードがある場合にもうまく機能するはずです。


4
理解できません。DAGがツリーではない場合、どうすれば二重カウントを回避できますか?実際、私が間違っていなければ、一般的なケースは各頂点に最大2つの先行がある場合に減らすことができ、後者の場合の線形時間アルゴリズムは一般的な場合のラインタイムアルゴリズムを提供します。
伊藤剛

O(|V|+|E|)k

あなたが私のコメントを誤解したのではないかと思います。実行時間ではなく、アルゴリズムの正確性に疑問を抱いています。DAGに4つの頂点A、B、C、Dがあり、エッジにA→B→DおよびA→C→Dがあり、各頂点にある程度の重みが与えられているとします。BとCの部分和を計算した後、単純にBとCの部分和を追加してDの合計を計算することはできません。そうすると、頂点Aの重みが2回追加されるためです。
伊藤剛

u<vw(u)

1
はい。そして今、私はこの質問を初めて見たとき、同じように質問を読み違えて、それが明白だと思ったことを覚えています。しかし、本当の質問はそれより難しいです。考える時間…。
伊藤剛
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.