グラフサイクルのスポッティング-簡単な説明


9

簡単な言葉でグラフのサイクルを見つける方法を理解するのに役立つ人がいますか?

私はこれや他のいくつかのウィキペディアのページなどの他の質問を読みましたが、それらは数学の専門用語にかなり早く下降しているようです。

私はJavaのグラフのモデル、モデリングノード、および「イン」と「アウト」のエッジを持っています-モデルは一方向にのみ接続されたノードを認識しているため、開始点としてリーフノードを見つけることができ、私の計画はルート上で見つけた他のすべてのノードのリストを保持しながら、「ウォーク」ごとにこれらの各リーフノードからグラフを遡ります。既にリストに何かが表示されている場合は、グラフでサイクルを見つけたことがわかります。ただし、これは少し単純化した感じです。

これは解決された問題だと思います。簡単に説明できればいいのですが。

-エース

回答:


6

グラフサイクルのスポッティングを素人の言葉で説明するために考えられる最も簡単な方法は、次のようなものです。

  • 最初に、グラフとは何か、ノードとエッジとは何かについての基本を知っていると想定します。この例では、すべてのエッジが一方向のみであるグラフがあると想定しています。
  • グラフを作成し、1つのノードを開始点として選択します。
  • ある種のコンテナオブジェクトを作成します(リストまたはハッシュが最適です)。それを「訪問済み」と呼びます。
  • 2番目のコンテナーオブジェクトを作成し(ここではキューが理想的です)、それを "Open"と呼びます。
  • 開始ノードを[開く]リストに追加します。
  • [開く]リストが空でない間、繰り返します。
    • Openから最初のアイテムを削除し、Currentと呼びます
    • CurrentがVisitedに存在する場合、サイクルがあります。
    • そうでない場合は、CurrentをVisitedに追加し、CurrentがアウトバウンドエッジからOpenに到達できるすべてのノードを追加します。
  • Openが空になり、サイクルが検出されなかった場合、サイクルはありません。(少なくとも、開始点からの到達可能セットには含まれません。グラフにアイランドがある場合、必ずしもグラフ全体ではありません。)

0

基本的には、グラフで幅優先検索を実行し、ハッシュマップを使用してアクセスしたノードを追跡します。

いつでも、既にアクセスされた(ハッシュマップに存在する)ノードに遭遇した場合、グラフに循環があることがわかります。

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