私の現在のプロジェクトには、入力と出力を持つノードのセットがあります。各ノードは、その入力値を取り、いくつかの出力値を生成することができる。これらの出力は、他のノードの入力として使用できます。必要な計算量を最小限に抑えるため、ノードの依存関係はアプリケーションの開始時にチェックされます。ノードを更新するとき、それらは互いに依存する逆の順序で更新されます。反復DFSで有向グラフのサイクルを検出する方法は?
つまり、ノードはの有向グラフに似ています。私は、反復DFS(巨大なグラフのスタックオーバーフローを回避する再帰はありません)を使用して依存関係を解き、ノードを更新するための順序を作成しています。
さらに、グラフの循環を避けたいのは、循環依存がアップデータアルゴリズムを壊し、永久に実行ループを引き起こすためです。
再帰スタック上のノードを追跡することによってDFSでサイクルを見つける再帰的なアプローチがありますが、には繰り返し実行する方法があります?私はその後、主依存関係リゾルバにサイクル検索を埋め込んで、処理速度を上げることができました。
このアプローチでも、これを円と呼びます。Aは開始ノードです。 AはBとCに依存します。BとCの両方がDに依存しています。何か不足していますか?私は、あなたのアプローチが「訪問済み」フラグの代替として理解しています。 – RenWal
良い点。依存ノードをキューに入れ、キュー(DFS)の前面をポップすることによってそれらを処理すると仮定しました。しかし、逆にそれらを更新したいとも思われます。答えを更新する必要があります... –
AをBに依存させるとBがAに更新されるように、それらを更新したいので、基本的にそれらをスタックに入れます(そしてそう、「逆の待ち行列」と呼ぶことができます)。そのスタックは保存され、次にアップデータスレッドに供給されます。私はツリー越え中に更新を実行しません。 サイクルはこれです:Aは開始ノードです。 AはBに依存します。BはCに依存します。CはAに依存します。この依存関係は解決できない可能性があるため、この状況を特定する必要があります。 – RenWal