DAGの各ノードの子孫の数


8

1)DAGの各頂点の子孫の数を計算するために、単純なO(| E |。| V |)よりも優れたアルゴリズムはありますか?

2)ノードが1つずつ追加され、既存のノードの空でないサブセットに接続すると想定して、これを行うオンラインアルゴリズムはありますか?

コンテキスト:m = O(n)、何百万もの頂点、通常は数千万のエッジの場合に興味があります。または、シンクでもある子孫の数を数えると便利です。


すべてのノードの子孫のセットを表す方法として、確率論的アプローチはmin-hashingです。min-hash構造の和集合は取るに足らないものであり、un-hashの一致の数から和集合の基数を推定できます。

ただし、DAGを伝播するときの動作がどの程度かはわかりませんが、直感的には、エラーがかなり速く複合するように見えます。


非常に関連:https : //cstheory.stackexchange.com/questions/553/what-bounds-can-be-put-on-counting-reachable-nodes-in-a-dag そして実際には:https:// cstheory.stackexchange.com/questions/18787/what-is-the-fastest-deterministic-algorithm-for-incremental-dag-reachability


質問を変更しました。シナリオ1のO(n ^ 2 + m)は役に立ちますか?
Niklas B. 14

それは十分に速くはないでしょうが、私はあなたがそれをどのように行うか聞いてみたいと思います。
アーサーB 14

ノードの次数は制限されていますか?または、一般的に、より高速なアルゴリズムの設計に役立つグラフのプロパティはありますか?直感的には、DAGはここでは一般的なグラフほど単純ではありません。一般的なグラフをDAGを形成するSCCに分解できるためです。
NiklasB。14年

1
私の以前の答えに対する私の謝罪-それは間違いなく間違っていました!
templatetypedef 14

2
CS.stackexchange.comで質問することをお勧めします。私の直感は、それが見かけよりも難しい問題だということです。ノードの重みがあり、すべてのノードについて到達可能な総重みを知りたいという問題にそれを一般化すると、私が述べたSCC削減による一般的なグラフの同じ問題と少なくとも同じくらい難しいです。しかし、あなたが直面しているグラフの種類のための計算スピードアップするためにいくつかのテクニックがあるかもしれない
ニクラスB.

回答:


4
  1. DAGのノードをトポロジ的に並べ替えます。
  2. ノードごとにN、を設定しN.QueryCount = 0ます。
  3. 各ノードについて N、トポロジの逆順で:
    • セットN.Descendants = {N} U {C.Descendants | C in N.Children}
    • (N, N.Descendants.Count)アルゴリズムからの収量。
    • もし N.Parents空のは、処分できますN.Descendants
    • それぞれの場合CN.Children、インクリメントC.QueryCount。もしそうならC.QueryCount == C.Parents.Count、あなたは処分することができますC.Descendants

ノードの次数が大きい場合、これはもちろん高価です。最悪の場合の複雑さは、指定されていない「単純なアルゴリズム」より大幅に優れているとは限りません。

問題は、これが解決するのが非常に難しい問題であるということです。数百万のノード、数百万のエッジなどを持つDAGがあるとします。グラフのこの部分を示します。

A--> B
 \-> C

子孫はAいくつありますか?子孫の数Bの子孫の数プラスCマイナスの共通子孫の数BC。それは困難を作成する3番目の用語です。Band の子孫の数だけを知ることはできませんC。子孫が何であるかも知る必要があります。


1
それは少なくともO(n * m)のようです
NiklasB。

1
そして素朴なアルゴリズムは、ちょうどすべてのノードから到達可能性(DFSまたはBFS)をやっているだろう
ニクラス・B.

@NiklasB。セット和集合がO(1)の場合、これはO(n + m)です。もちろん、セットユニオンはそうではありませんが、ノードの次数が比較的低い場合、CPUとRAMの使用に関しては十分に機能するはずです。編集:これは正しくありません。無視してください。
ティモシーシールズ

1
程度は低くても、多くの頂点に多くの後継者が存在する可能性があります。不均衡な二分木(ノードのチェーンなど)の場合、重みによる共用体を使用しない限り、O(n ^ 2)になります(ただし、一般的なケースではそれほど多くはないと思います)
Niklas B 。14

@NiklasB。ああ、そうです、Descendantsセットは終わり近くでサイズがO(n)に近いためです。
ティモシーシールズ

1

すべての頂点のすべての子孫をリストすると、サイズの出力が生成される可能性がありますO(n²)。たとえば、グラフが線形グラフの場合、入力エッジのない頂点にはn - 1子孫、次の頂点n - 2などがあります。

子孫を列挙せずに子孫の数を決定できるかどうかは、問題になります。証明はできませんが、答えはノーだと確信しています。頂点が想定x子供を持っているuv、あなたはの子孫のセットの共通部分のカーディナリティ見つけなければならないuとしvていますが、そのセットについて知っているだけでは何もない- uv、単一の子孫を共有することはできませんか、彼らは子孫の同じセットを持っていること。

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