親愛なる読者、この記事では、Depth First Search(DFS)の概念を説明します。 これは、多くの競争力のあるコーディング試験で共通の問題であるグラフの概念です。 それでは、Pythonを使用してDFSトラバーサルを作成することを見てみましょう。
目次
深さの最初の検索とは何ですか?
深さ優先探索は、スタックデータ構造を利用してグラフやツリーを横断するアルゴリズムです。 深さ優先検索の概念は、”深さ”という言葉から来ています。 ツリーは枝の深さまでトラバースし、残りのノードまでトラバースします。
反復ごとに訪問されたノードを含む空の”スタック”を考えてみましょう。 ここでの私たちの仕事は次のとおりです:
- ルートノードから開始し、スタックにプッシュします。
- ツリーの隣接するノードをチェックし、一つのノードを選択します。
- 選択したノードのブランチ全体をトラバースし、すべてのノードをスタックにプッシュします。
- 枝の終わり(隣接ノードがなくなった)、すなわちn番目の葉ノードに到達したら、単一のステップで戻って、n-1番目のノードの隣接ノードを探します。
- n-1番目のノードに隣接するノードがある場合は、それらのブランチをトラバースし、ノードをスタックにプッシュします。
深さの概念最初の検索イラスト
以下の例のグラフを見てみましょう:
aはルートノードです。 したがって、Aが訪問されているので、これをスタックにプッシュします。
Stack : A
ブランチA-Bに行きましょう。Bは訪問されていないので、Bに行き、bをスタックに押します。
Stack : A B
今、私たちは私たちのA-Bブランチの終わりに来て、私たちはAであるn-1番目のノードに移動しました。Aの隣接するノードを見ていきます。S.Visit Sそしてそれをスタックにプッシュします。 今、あなたはs-C-Dブランチを横断する必要があります。Dまでの深さまで、すなわちs、C、Dを訪問したようにマークする必要があります。
Stack: A B S C D
Dには他の隣接ノードがないため、Cに戻り、隣接する分岐E-H-Gを深さまでトラバースしてスタックにプッシュします。
Stack : A B S C D E H G
Dに到達すると、訪問されていない唯一の隣接ノードすなわちFがあります。 同様にスタックにFを押します。
Stack : A B S C D E H G F
このスタック自体がDFSのトラバーサルです。
コーディング深さPythonでの最初の検索アルゴリズム
あなたが知っておく必要がありますように、隣接リストと隣接行列であるグラフを表現する多くの方法があります。
次の例では、グラフ内の各ノードの隣接リストを定義しました。
graph1 = { 'A' : , 'B' : , 'C' : , 'D' : , 'E' : , 'F' : , 'G' : , 'H' : , 'S' : }
メモ: この隣接リストは、ユーザから入力することができ、ハードコードする必要はない。
ここで、グラフ(隣接リスト)、ノード、訪問したノードのリストの3つのパラメータを入力として取るDFS関数を定義します。
現在のノードが訪問されていない場合、すなわち訪問されたリストに存在しない場合は、訪問されたとしてマークし、訪問されたリストに追加します。
次のノードに移動し、このノードをdfs関数に再帰的に渡します。 このようにして、各ノードは深さまで移動し、それをDFS出力として出力します。
def dfs(graph, node, visited): if node not in visited: visited.append(node) for k in graph: dfs(graph,k, visited) return visitedvisited = dfs(graph1,'A', )print(visited)
完全なコードと出力
graph1 = { 'A' : , 'B' : , 'C' : , 'D' : , 'E' : , 'F' : , 'G' : , 'H' : , 'S' : }def dfs(graph, node, visited): if node not in visited: visited.append(node) for k in graph: dfs(graph,k, visited) return visitedvisited = dfs(graph1,'A', )print(visited)
上記のコードの出力は次のとおりです:
結論
私はあなたがDFSアルゴリズムにこのチュートリアルに従っていると同様にコードと例を理解することができたことを願っています。 横断をよりよく理解するために、あなたの横にあるペンと紙を使って試してみてください。