線形時間での有向非循環グラフのソースの検索


10

有向非巡回グラフ与えられた場合、頂点のは、その次数がゼロの場合のソースであり、出力アークのみを持つことを意味します。D=VvV

与えられた有向非巡回グラフでソースを見つけるための線形時間アルゴリズムはありますか?

追加質問:線形時間ですべてのソースを見つけることができますか?


2
ルートとは、すべての発信エッジがあり、着信エッジがないノードを意味しますか?その場合、複数のルーツがある可能性があります。
Paresh 2013年

はい、そうです。だから私は「根」ではなく「根」と言います。
breezeintopl 2013年

2
その場合、線形時間アルゴリズムの定義では不十分ですか?
Paresh 2013年

3
データ構造とは何ですか?隣接行列、近隣リスト、隣接リスト、または何が与えられていますか?サイズに比例して、頂点の(受信)近傍を時間で確認できますか?
PAL GD

5
頂点の数が線形であることを意味する場合は、それを示す必要があります。また、隣接リストは有向グラフではあいまいです-入ってくるエッジ、出て行くエッジの両方を別々のリストにリストしますか、それとも両方を一緒にリストしますか?
Yuval Filmus

回答:


20

Yuvalが述べているように、データ構造はここで重要です。いくつかの種類の隣接リストの解決策を提供しようと思います。

  1. 着信エッジリスト:各ノードには、このノードへの着信エッジがある頂点のリストがあります。すべての頂点をスキャンして、隣接リストのサイズが かどうかを確認するだけです。サイズ0のリストは着信エッジがないことを意味するため、ノードはソースであるか、切断されています。連結グラフを仮定すると、各頂点のこのスキャンはあなたのリストに与えるすべてのソースを(またはあなたが1見つけた後に停止することができます)でO | V |時間-数の線形頂点を00O(|V|)
  2. 発信エッジリスト:各ノードには、このノードからの有向エッジがある頂点のリストがあります。各ビットが0に初期化された頂点を表すビット文字列を保持します。最初のノードから開始して、リストのスキャンを開始して、そこから出て行くエッジがある頂点を探します。そのようなすべてのノード(隣接ノード)をソースにすることはできないため、対応するビットをビット文字列に設定し続けます。最後に、対応するビットがまだ設定されていないすべての頂点がソース頂点です。あなたは、線形時間でこれを行うことができ、グラフの大きさ - O(|V|+|E|
  3. 両方のリストを一緒に:各頂点についてこの頂点への、またはこの頂点からのエッジ持つ頂点の混合リストがあり、他の属性が2つのうちどちらが実際に当てはまるかを示します。このアプローチは上記の2に似ていますが、すべての入力エッジが現在の頂点を直ちに除外します(ビットセットをマークできます)。すべての頂点を通過する必要があるポイント2とは異なり、ここでは、ソースが早く見つかるかもしれません。止めなければ、すべてのソースが手に入ります。両方の場合のために、時間が線形再びグラフの大きさ - O | V | + | E |O(|V|+|E|
  4. 両方のリストを個別に:着信エッジリストを選択して、1を実行します。

補足として、データ構造を選択する場合は、実行するすべての操作と頻度を分析し、適切なデータ構造を選択する必要があります。

編集:ケース1の場合、ソースの数が|に比べて非常に少ないDAGがある場合 V | (たとえば、1つのソースを持つツリー内)、および任意の頂点からソースまでの平均距離が|に比べて小さい場合 V | そしてあなたが唯一のいずれかのソースをしたい、あなたは(最悪の場合漸近複雑さが同じになりますが)平均アルゴリズムに速く使用することができます。任意の頂点をランダムに選択し、その親のいずれかに(入力エッジリストから)移動し、さらにその親に移動して、親のないノード(ソース)に到達するまで続けます。このわずかな効率向上は、アルゴリズムが少し複雑な非常に限られたタイプのグラフ用です。|V||V|


1
入力エッジリストの場合、単一のソースを見つけるだけでよい場合は、ソースに到達するまで、任意のエッジをたどって先行ノードを取得する方が高速ではないでしょうか。特にグラフがフラットである場合、つまり、すべての頂点のすべてのソースへの平均距離がよりもはるかに小さい場合V | |V|
Simon S

|V|

回答ありがとうございます!私が意味するのは、2番目のケース、発信リストだと思います。ところで、なぜO(| V | + | E |)なのですか?| E |を知っています。すべてのエッジをスキャンする必要がありますが、| V | から?ありがとうございました!
breezeintopl 2013年

Θ|V|+|E||E|O|V|O|V|2|V|

0

O|V|1


3
データ構造にノードのインエッジのリストが含まれていない場合、親を見つけるにはすでにO(m)(ツリーではO(n)の時間がかかります。ツリーのルートへのパスは直線的になる可能性があるため、長い間、これは2次の解にすぎませんが、
インエッジ

-1

隣接リスト形式で与えられたグラフG =(V、E)があると仮定します。(ここで明確にするために、リストにはソースからのすべての発信エッジが含まれています)。線形時間でグラフGの逆を作成できます。次に、逆グラフを反復処理して、空の隣接リストを持つすべての頂点を収集できます。これらの頂点には、逆グラフに出力エッジがありません。つまり、元のグラフに入力エッジがないため、これらはソース頂点です。

実行時間は線形です。グラフの逆を作成するには、最大でO(| V | + | E |)時間かかります。グラフの逆を繰り返すには、O(| V |)時間かかります。


1
正直なところ、グラフの逆計算は、ソースを見つけるよりも難しい問題のように聞こえます。ソースを取得する方法を理解できない人が、すべてのエッジを反転する方法を理解できるとは思えません。
David Richerby

@DavidRicherbyは、グラフの逆を計算するのは難しいと言っていました。どのように定義しますか?それが時間の複雑さである場合、線形時間で行うことができます。ここで解決策を見ることができます[リンク](stackoverflow.com/questions/40378152/…)。問題は、グラフのソースを見つける線形時間ソリューションについてであり、私の提案するソリューションはそれを行います。あなたがそれができないと思うなら、あなたは具体的であり、私のアルゴリズムがどのように線形時間要件を満たさないのか教えてください?
MGB 2018

概念的にはもっと難しいという意味です。この演習を解くには、質問者は他の演習を解く必要があるだけですが、他の演習は最初の演習よりも難しいように見えます。
David Richerby
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.