トポロジカルソート電卓
KahnのアルゴリズムまたはDFSを使用して、有向非巡回グラフ(DAG)のトポロジカル順序を計算します。閉路の検出、閉路パスの報告、並列実行レイヤービューの構築、辞書順最小の並べ替えをサポートし、インタラクティブなグラフ上で各ステップをアニメーション表示します。
広告ブロッカーにより広告が表示できません
MiniWebtool は広告収益で無料提供しています。このツールが役に立ったら、Premium(広告なし+高速)をご利用いただくか、MiniWebtool.com を許可リストに追加して再読み込みしてください。
- または Premium(広告なし)にアップグレード
- MiniWebtool.com の広告を許可してから再読み込みしてください
トポロジカルソート電卓
トポロジカルソート計算機は、すべての有向エッジ u から v について u が v よりも前に位置するような、有向非巡回グラフ (DAG) の頂点の線形順序を計算します。グラフをエッジリストまたは隣接リストとして入力すると、KahnアルゴリズムまたはDFSポストオーダーを使用してトポロジカル順序を返し、サイクル検出(正確なサイクルパス付き)、タスクの並列実行レイヤーへのグループ化、有効な順序の数のカウント、およびインタラクティブなグラフ上での各ステップのアニメーション表示を行います。
トポロジカルソートとは何ですか?
有向グラフ G = (V, E) が与えられたとき、トポロジカルソート(またはトポロジカル順序)とは、すべての有向エッジ (u → v) について、配置内で u が v よりも前に現れるような頂点の線形配列 v₁, v₂, …, vₙ です。トポロジカル順序は、グラフに有向サイクルがない場合、つまりグラフが DAG である場合にのみ存在します。この順序は一意であることは稀で、複数の頂点の入次数が同時にゼロになる場合、多くの有効なトポロジカルソートが存在し得ます。
E 内のすべてのエッジ (u → v) について: position(u) < position(v) であること
この電卓で使用されているアルゴリズム
Kahnアルゴリズム(BFSベース、1962年)
Kahnアルゴリズムは、最も直感的なトポロジカルソートです。各ステップで入次数がゼロ(入ってくるエッジがない)の頂点を選択し、それを出力に追加し、その後続ノードの入次数を減らすことでグラフからその頂点を「削除」します。複数の頂点の入次数がゼロの場合、タイブレーク(同順位の解消)には、最小ヒープ(辞書順で最小の順序が得られる)または FIFO キュー(挿入順が得られる)を使用できます。Kahnアルゴリズムは O(|V| + |E|) 時間で実行され、サイクル検出器としても機能します。キューが空になった後も入次数が 0 より大きい頂点が残っている場合、そのグラフにはサイクルがあります。
Q ← { v ∈ V : indeg(v) = 0 }
L ← [ ]
while Q が空でない:
u ← Q.pop()
L.append(u)
for 各エッジ u → v:
indeg(v) -= 1
if indeg(v) = 0: Q.push(v)
if |L| < |V|: サイクルを報告
else: L を返す
DFSポストオーダー(Tarjan、1976年)
DFSアルゴリズムは深さ優先探索を実行し、頂点の探索が終了(つまり、その後続ノードがすべて完全に探索された)するたびに、その頂点をスタックにプッシュします。最後にスタックを反転させると、有効なトポロジカル順序が得られます。サイクル検出も自然に行えます。探索が進行中(GRAY とマーク)の頂点に遭遇した場合は、後退エッジが見つかったことを意味し、そのグラフは DAG ではありません。DFSポストオーダーも O(|V| + |E|) 時間で実行されます。
for 各頂点 u in V: color[u] ← WHITE
L ← 空のスタック
for 各頂点 u in V:
if color[u] = WHITE: visit(u)
return reverse(L)
visit(u):
color[u] ← GRAY
for 各エッジ u → v:
if color[v] = GRAY: サイクルを報告
if color[v] = WHITE: visit(v)
color[u] ← BLACK; L.push(u)
並列実行レイヤー
DAG の階層(レイヤー)表示は、すべてのエッジが低い番号のレベルから高い番号のレベルへ向かうように頂点を分割します。同じレイヤー内の頂点は互いに独立しているため、並列に実行できます。レイヤーの数は最長パスの長さに 1 を加えたものに等しくなります。これは DAG のクリティカルパスであり、無制限の並列処理が可能であっても、すべてのタスクを完了するために必要な最小の逐次ラウンド数です。この電卓は、入力が DAG である場合にレイヤー表示を自動的に生成します。
サイクル検出
グラフに有向サイクルが含まれている場合、トポロジカルソートは不可能です。当電卓は正確なサイクルパス(例: A → B → C → A)を報告し、視覚化上でサイクルのエッジを赤くハイライトします。サイクル上の単一のエッジを削除するだけで、非巡回性を回復できます。
入力形式
エッジリスト
各有向エッジを ソース -> ターゲット の形式で記述し、カンマまたは改行で区切ります。使用可能な矢印のバリエーション: ->, →, =>, -->, :。エッジを連鎖させることもできます。A -> B -> C は A->B と B->C の短縮形です。頂点ラベルには、文字、数字、アンダースコア、ダッシュ、ドットを使用できます。
C -> D
Shirt -> Tie -> Jacket
隣接リスト
各頂点、コロン、そしてその直接の後続ノード(その頂点が指している頂点)を記述します。後続ノードがない頂点も、D: のように行を記述する必要があります。
B: D
C: D
D:
この電卓の使い方
- 形式を選択する: ラジオボタンでエッジリストと隣接リストを切り替えます。
- グラフを入力する: データを貼り付けるか、クイックサンプル(着替えの順序、履修科目の前提条件、ビルドターゲット、サイクルありのグラフなど)のいずれかをクリックします。
- アルゴリズムを選択する: 一意で再現可能な順序には Kahn の辞書順、入力順を保持するには挿入順、古典的な深さ優先手法には DFS ポストオーダー、または「すべて表示」で各順序を並べて確認します。
- 「トポロジカルソートを実行」をクリック: 順序、サイクル検出、レイヤー表示、クリティカルパス長、有効な順序の総数、およびインタラクティブなグラフが下に表示されます。
- 探索する: 再生ボタンを押すと、各頂点が出力されるステップを1つずつ確認できます。入次数バッジはリアルタイムで更新されます。ノードをドラッグしてレイアウトを自由に調整できます。
実世界での応用
ビルドシステムとコンパイラ
make、Bazel、Gradle、npm などのツールは、各ターゲットがすべての依存関係の後にコンパイルされるように、ビルドターゲットをトポロジカルソートします。依存関係グラフのサイクルは通常、致命的なエラーとして報告されます。ビルドシステムがどこから開始すべきか判断できないためです。
タスクスケジューリング
プロジェクトマネージャーは、タスクの依存関係を把握するために DAG を使用します。トポロジカルソートは有効な実行順序を提供し、レイヤー表示は無制限の並列処理下での最小ラウンド数を示します。最長のチェーンは、プロジェクトの期間を決定するクリティカルパスです。
履修科目の前提条件計画
大学のコースカタログは DAG です。エッジは前提条件の関係を表します。トポロジカル順序は有効な学習計画となり、レイヤーは各学期中にどの科目のセットを並行して履修できるかを学生に示します。
スプレッドシートの再計算
セルが変更されると、スプレッドシートはすべての下流のセルを依存関係順に再計算する必要があります。これはセル依存関係 DAG のトポロジカルソートです。循環参照(サイクル)はアプリケーションによって拒否されます。
パッケージマネージャーとプラグインローダー
Apt、pip、Homebrew、Maven、および無数のプラグインフレームワークは、依存関係 DAG をトポロジカルソートすることで、インストールまたはロードの順序を解決します。
シンボル解決とインストラクションスケジューリング
コンパイラは宣言を順序付けるためにトポロジカルソートを使用し、CPU はデータ依存関係に違反せずに命令をリオーダバッファにスケジュールするためにデータ依存 DAG を使用します。
トポロジカル順序のカウント
n 個の頂点を持つ DAG の場合、個別の有効なトポロジカル順序の数は、1(完全に順序付けられたチェーンの場合)から n!(エッジのないグラフの場合)の範囲になります。正確な数を計算することは一般に #P完全 な問題ですが、16 頂点までのグラフについては、この電卓はビットマスク動的計画法(f(S) = Σ f(S ∪ {v})、ここで v ∉ S かつ v のすべての前任ノードが S に含まれる)を用いて列挙します。
計算量とパフォーマンス
- 時間: KahnアルゴリズムとDFSポストオーダーはどちらも O(|V| + |E|) で実行され、グラフのサイズに対して線形です。
- 空間: 入次数の追跡と出力順序のために O(|V|)、隣接構造のために O(|V| + |E|) を使用します。
- サイクル検出: 両方のアルゴリズムに組み込まれています。Kahn は |出力| < |V| のときにサイクルを検出し、DFS は後退エッジ(GRAY の隣接ノード)が見つかったときに検出します。
- このツールの制限: インタラクティブな視覚化では最大 80 頂点および 800 エッジまで対応しています。順序のカウントは、頂点 16 個までとなります。
よくある質問
トポロジカルソートとは何ですか?
有向非巡回グラフのトポロジカルソートとは、すべての有向エッジ u から v について u が v よりも前に位置するように頂点を並べた線形順序です。これは、依存関係を尊重してタスクを処理する有効な順序を表します。
この電卓はどのアルゴリズムを使用していますか?
この電卓はKahnアルゴリズムとDFSポストオーダーの両方を実行します。Kahnアルゴリズムは、入次数がゼロの頂点を繰り返し削除し、その後続ノードの入次数を減らします。DFSポストオーダーは深さ優先探索を実行し、終了順序を反転させます。どちらも O(|V| + |E|) 時間で動作します。
グラフにサイクルがある場合はどうなりますか?
有向サイクルを持つグラフにはトポロジカルソートが存在しません。電卓はサイクルを検出し、視覚化の中で赤くハイライトし、正確なサイクルパスを報告するため、どのエッジを削除すればグラフを DAG にできるかを確認できます。
辞書順で最小のトポロジカル順序とは何ですか?
複数のトポロジカル順序が有効な場合、各ステップで入次数がゼロの頂点のうち、常にアルファベット順で最小のものを選択することで、辞書順で最小の順序が得られます。この電卓のデフォルトの Kahn モードはこの一意の順序を返します。
レイヤーまたはレベル表示とは何ですか?
レイヤー表示は、ソースからの最長パス長によって頂点をグループ化します。同じレイヤー内の頂点間には依存関係がないため、並列に実行できます。レイヤー数は最長依存チェーンに1を加えたものになります。
グラフに有効なトポロジカル順序が複数存在することはありますか?
はい。Kahnアルゴリズムの任意のステップで入次数がゼロの頂点が複数ある場合、そのどれを次に選んでも構いません。この電卓は、最大 16 頂点までのグラフについて、個別のトポロジカル順序の正確な数をカウントします。
KahnアルゴリズムとDFSポストオーダーの違いは何ですか?
Kahn はトップダウン方式です。繰り返しソース(入次数 0)を選択し、それらを最初に出力します。DFS ポストオーダーはボトムアップ方式です。シンク(出次数 0)を先に完了させ、それらを順序の先頭に追加していきます。どちらも O(|V| + |E|) であり、有効なトポロジカル順序を生成しますが、通常は異なる結果になります。Kahn は並列化や辞書順への対応が容易であり、DFS は強連結成分などの他の DFS ベースの解析と組み合わせるのが容易です。
このツールがサポートする最大グラフサイズは?
この電卓は最大 80 頂点と 800 エッジをサポートします。有効なトポロジカル順序の総数のカウントは、問題が #P完全であり状態空間が 2ⁿ で増大するため、16 頂点に制限されています。インタラクティブな視覚化とアニメーションは、最大サイズまでスムーズに動作します。
参考文献
- トポロジカルソート — Wikipedia
- 有向非巡回グラフ — Wikipedia
- 深さ優先探索 — Wikipedia
- クリティカルパス法 — Wikipedia
- 強連結成分 — Wikipedia
このコンテンツ、ページ、またはツールを引用する場合は、次のようにしてください:
"トポロジカルソート電卓"(https://MiniWebtool.com/ja/トポロジカルソート計算機/) MiniWebtool からの引用、https://MiniWebtool.com/
作成: miniwebtool チーム、更新日: 2026年4月20日
また、AI 数学ソルバー GPT を使って、自然言語による質問と回答で数学の問題を解決することもできます。
その他の関連ツール:
高度な数学操作:
- antilog電卓
- ベータ関数電卓
- 二項係数電卓
- 二項確率分布電卓
- ビットに基づいての電卓
- 中心極限定理電卓
- 組み合わせ電卓
- 相補誤差関数電卓
- 複素数電卓
- エントロピー電卓
- エラー関数電卓
- 指数減衰電卓-高精度
- 指数成長電卓 高精度
- 指数積分電卓
- 指数電卓-高精度 おすすめ
- 階乗電卓
- ガンマ関数電卓
- 黄金比電卓
- 半減期電卓
- パーセント成長率電卓
- 順列電卓
- ポアソン分布電卓
- 多項式の根電卓と詳細なステップ
- 確率電卓
- 確率分布電卓
- 比率電卓 おすすめ
- 二次式電卓
- 関数電卓 おすすめ
- 科学表記法電卓
- 有効数字電卓 新しい
- 立方和電卓
- 正の整数の電卓
- 平方和の計算
- 真理値表ジェネレーター 新しい
- 集合論電卓 新しい
- ベン図ジェネレーター3集合 新しい
- 中国剰余定理電卓 新しい
- オイラーのトーシェント関数電卓 新しい
- 拡張ユークリッドアルゴリズム電卓 新しい
- モジュラー乗法逆数電卓 新しい
- 連分数電卓 新しい
- ダイクストラ最短経路電卓 新しい
- 最小全域木電卓 新しい
- グラフ次数列バリデーター 新しい
- 完全順列 サブファクトリアル電卓 新しい
- スターリング数電卓 新しい
- 鳩の巣原理電卓 新しい
- マルコフ連鎖定常分布電卓 新しい
- 四捨五入電卓 新しい
- 負の二項分布電卓 新しい
- 重複順列電卓 新しい
- モジュラー冪乗計算機 新しい
- 原始根電卓 新しい
- ブール代数簡略化ツール 新しい
- カルノー図 (K-Map) ソルバー 新しい
- グラフ彩色電卓 新しい
- トポロジカルソート電卓 新しい
- 隣接行列電卓 新しい
- 包除原理電卓 新しい
- 線形計画法ソルバー 新しい
- 巡回セールスマン問題ソルバー TSP 新しい
- ハミルトン路チェッカー 新しい