トポロジカル ソートを実行する必要がある一連のデータがあり、いくつかの仮定と制約があり、これに適した既存の効率的なアルゴリズムを誰かが知っているかどうか疑問に思っていました。
- データの関係は、DAG を形成することが知られています (したがって、心配する循環はありません)。
- A から B へのエッジは、A が B に依存していることを示しているため、B はトポロジー順序で A の前に表示される必要があります。
- グラフは必ずしも接続されているわけではありません。つまり、任意の 2 つのノード N と M について、エッジをたどって N から M に到達する方法がない場合があります (エッジの方向を無視しても)。
- データの関係は単独でリンクされています。これは、A から B に向かうエッジがある場合、A ノードだけがエッジの存在に関する情報を含むことを意味します。
問題は次のように定式化できます。
入ってくるエッジを持つ場合と持たない場合がある
S
グラフG
内のノードのセットが与えられた場合、セット内の任意のノードから到達可能な(エッジ方向に従う)内のすべてのノードで構成されるサブグラフのトポロジー順序を見つけます。G'
G
S
S
これは、セット内のノードに着信エッジがないことを必要とするため、トポロジカルソートの通常のアプローチを混乱させます。これは、私の場合には当てはまりません。病理学的ケースは次のとおりです。
A --> B --> D
| ^ ^
| | |
\---> C ----/
どこでS = {B, C}
。適切な順序付けは になりますD, B, C
が、通常のトポロジカル ソート アルゴリズムがたまたまB
前に考慮した場合、C
最終的には になりC, D, B
ます。これは完全に間違っています。A
(は から到達できないため、結果の順序には表示されないことに注意してくださいS
。これは、 のすべてのノードにS
着信エッジがある可能性がある例を示すためにあります)
さて、これは長い間解決されてきた問題であると想像しなければなりません。なぜなら、これは本質的に、1 つのインストール コマンドで複数のパッケージを指定するときにプログラムが好むものであり、実行しなければならないapt
ものだからです。yum
ただし、「依存関係解決アルゴリズム」などのキーフレーズを検索すると、この特定のケースを処理しない通常のトポロジカル ソートを説明する結果が得られます。
これを行う方法はいくつか考えられますが、どれも特に洗練されているとは思えません。誰かが適切なアルゴリズムへのポインタを持っているかどうか、できればデータを 1 回のパスで操作できるアルゴリズムを持っているかどうか疑問に思っていました。