データ構造におけるDFS(深さ優先探索):注文とアプリケーションとは

公開: 2022-06-27

目次

データ構造におけるDFSの意味

データ構造のDFSは、深さ優先トラバーサルとも呼ばれ、主にグラフまたはツリーデータ構造のすべての頂点を検索するために使用される再帰的アルゴリズムです。 トラバーサルとは、グラフのすべてのノードを訪問することです。 アルゴリズムはルートノード(グラフのルートノードとして任意のノードである可能性があります)から始まり、バックトラックする前に各ブランチに沿って可能な限り進みます。

アイデアは、ルートまたは任意のノードから開始し、ノードにマークを付けたままにすることです。 この後、マークされていない隣接ノードに移動し、マークされていない隣接ノードがなくなるまでこのループを続ける必要があります。 次に、マークされていない他のノードをバックトラックして調べ、それらをトラバースします。 最後のステップは、パス内のノードを印刷することです。

アルゴリズム

ノードのインデックスと訪問した配列を取得する再帰関数を作成します。

  1. 現在のノードを訪問済みとしてマークしたままにして、それを印刷します。
  2. 隣接するすべてのノートとマークされていないノートをトラバースし、隣接するノードのインデックスを使用して再帰関数を呼び出します。

人気のソフトウェアエンジニアリングコースをご覧ください

SL。 いいえ ソフトウェア開発プログラム
1 LJMU&IIITBのコンピュータサイエンスの理学修士 CaltechCTMEサイバーセキュリティ証明書プログラム
2 フルスタック開発ブートキャンプ ブロックチェーンのPGプログラム
3 ソフトウェア開発のエグゼクティブ大学院プログラム-DevOpsの専門分野 すべてのソフトウェアエンジニアリングコースを表示

プロパティ

データ構造内のDFSの時間と空間の分析は、その適用領域によって異なります。 理論的には、DFSは主に完全グラフを横断するために使用され、時間O(| V | + | E |)がかかります。ここで| V | 頂点の数と|E|を示しますエッジの数を示します。 このグラフは線形です。

これらのアプリケーションでは、スペースO(| V |)は、検索パスに格納されている頂点のスタックと、既にアクセスされている頂点のセットを保持するための最後の手段としても使用されます。 したがって、時間とスペースの境界設定は、幅優先探索と同様です。 ここで、使用される2つのアルゴリズムは、それらの複雑さにあまり依存せず、2つのアルゴリズムによって生成される頂点次数のさまざまな特性に依存します。

WebクロールやAIでソリューションを見つけるなど、特定のドメインに関連するデータ構造でのDFSのアプリケーションに関しては、トラバースが必要なグラフは、全体としてアクセスするには大きすぎる可能性があります。 このような場合、検索は制限された深さまでのみ実行されます。 ディスク容量やメモリなどの有限のリソースが原因です。 データ構造は通常、以前にアクセスしたすべての頂点のセットを追跡するために使用されることはありません。 制限された深さで実行された検索では、拡張されたエッジと頂点の単位に関しては、時間が線形になります。

ただし、一部の頂点は複数回検索され、他の頂点は検索されない可能性があるため、この数値はグラフ全体と同じサイズではないことに注意してください。

このような場合、DFSは、より有望なブランチを選択するためのヒューリスティックな方法にも目を向けます。 最後に、適切な深さ制限を決定できない場合、事前に反復深化DFSが、一連の増加制限を介して繰り返し適用されます。

世界のトップ大学からオンラインでソフトウェア開発コース学びましょう。 エグゼクティブPGプログラム、高度な証明書プログラム、または修士プログラムを取得して、キャリアを迅速に追跡します。

深さ優先探索アルゴリズム

標準のDFS実装のグラフの各頂点は、次の2つのカテゴリのいずれかに分類されます。

  1. 訪問していません
  2. 訪問した

このアルゴリズムは、各頂点を正確に特定し、それらを訪問済みとしてマークすると同時に、サイクルを回避するために使用されます。

これがDFSアルゴリズムの仕組みです。

  1. グラフの特定の頂点をスタックに配置します。
  2. スタックの一番上のアイテムは、訪問済みリストに追加する必要があります。
  3. その頂点の隣接ノードのリストを作成し、スタックの一番上にある訪問済みリストにないノードを追加します。
  4. スタックが空になるまで、前の手順を繰り返します。

DFSの注文

頂点の順序付け: DFSでグラフまたはツリーの頂点を線形に順序付けるには、次の4つの方法があります。

  1. DFSアルゴリズムが最初にアクセスした方法で配置された頂点のリストは、事前順序付けと呼ばれます。 これは、検索の進行状況を簡潔に説明する方法です。
  2. アルゴリズムが最後にアクセスした順序での頂点のリストは、ポストオーダーと呼ばれます。
  3. 最初の訪問とは逆の順序での頂点のリストは、逆の事前順序付けです。 したがって、ポストオーダーと間違えないでください。
  4. 前回の訪問とは逆の順序での頂点のリストは、逆のポストオーダーです。 予約注文と間違えないでください。

さらに、二分木の順序付けと逆順列があります。

グラフの深さ優先探索またはDFS

グラフのDFSは、ツリーのDFSとほぼ同じです。 唯一の違いは、ツリーとは異なり、グラフにサイクルがある場合があることです。 ノードは複数回訪問される可能性があり、ノードの処理を回避するために、ブール訪問された配列が使用されます。

深さ優先探索の出力

深さ優先探索は、探索ですでに到達している頂点のスパニングツリーの観点からより簡単に表現されます。 このスパニングツリーに基づいて、元のグラフエッジは3つのクラスに分類されます。ツリーのノードがその子孫の1つに向けられている前端、ノードがその祖先の1つに向けられている後端、およびクロスエッジです。 、これは前の機能のどちらも実行しません。

深さ優先探索(DFS)のアプリケーション

深さ優先探索は、ビルディングブロックとして次のアルゴリズムで使用されます。

  • 接続されているコンポーネントを検索しています。
  • 2-(頂点またはエッジ)連結成分の検索。
  • グラフのブリッジを見つける。
  • 3-(頂点またはエッジ)連結成分の検索。
  • トポロジカルソート。
  • 強く接続されているコンポーネントを見つける。
  • ある種が系統樹の1つまたは別の種に類似しているかどうかを調べる。
  • 平面性テスト。
  • 任意のグループの制限セットを決定するための単語を生成します。
  • 迷路のように、解決策が1つしかないパズルを解きます。
  • 迷路生成
  • グラフでの二重連結性の検索。

DFS擬似コードとPythonでの実装

init()関数は、すべての頂点に確実にアクセスするために、以下の擬似コードのすべてのノードで実行されます。 グラフにはさまざまな切断された領域がある可能性があるため、これは特に重要です。

擬似コードは次のとおりです。

DFS(G、u)

u.visited = true

各v∈G.Adj[u]に対して

v.visited==falseの場合

DFS(G、v)

初期化() {

各u∈Gについて

u.visited = false

各u∈Gについて

DFS(G、u)

}

PythonでのDFS実装は次のとおりです。

グラフ={

'5':['3'、 '7']、

'2':['1'、 '3']、

'6':['7']、

'3':[]、

'4':['6']、

'7' : []

}

訪問済み=set()

def dfs(visited、graph、node):

ノードが訪問されていない場合:

印刷(ノード)

visited.add(node)

グラフ[ノード]のネイバーの場合:

dfs(visited、graph、neighbour)

print( "これはDFSです:")

dfs(visited、graph、 '5')

出力:

これはDFSです:5

人気のソフトウェアエンジニアリングコースをご覧ください

SL。 いいえ ソフトウェア開発プログラム
1 LJMU&IIITBのコンピュータサイエンスの理学修士 CaltechCTMEサイバーセキュリティ証明書プログラム
2 フルスタック開発ブートキャンプ ブロックチェーンのPGプログラム
3 ソフトウェア開発のエグゼクティブ大学院プログラム-DevOpsの専門分野 すべてのソフトウェアエンジニアリングコースを表示

深さ優先探索の複雑さ

John Reifは、深さ優先探索の計算の複雑さを調査しました。 正確には、グラフでは、与えられたファクトはGであり、Oを反復DFSアルゴリズムによって決定される標準次数とします。 Gはグラフを表し、Oは冗長DFSアルゴリズムの順序付け出力を表します。 この出力は、辞書式DFS順序付けと呼ばれます。

結論

DFSアルゴリズムの主な目標は、ターゲットグラフのサイクルを回避するすべての頂点にアクセスすることです。 検索操作または注文操作の高度な実装に関与したい場合は、深さ優先探索とデータ構造のプレミアムで全体的なコースを追求することを確実に検討する必要があります。

upGradには、コンピュータサイエンスの理学修士ビッグデータの専門分野など、一流のDFSコースがいくつかあります。

次の一歩を踏み出すのに苦労していて、専門家のアドバイスを探している場合、 upGrad Mentorshipは、業界で最高のキャリアカウンセラーと専門家との1対1のセッションを提供しようとしています。

1.深さ優先走査の特性または使用法は何ですか?

DFSまたは深さ優先探索アルゴリズムはグラフを深さ方向に横断し、検索を開始するために次の頂点を取得することを忘れないように、反復で行き止まりに遭遇したときにスタックを利用します。

2.深さ優先探索で使用されるデータ構造はどれですか?

DFSに使用されるデータ構造はスタックです。 スタックは主に、DFSまたは深さ優先探索の標準的な実行で使用されます。

3.深さ優先探索アルゴリズムの時間とスペースの要件は何ですか?

O(| V |)は時間計算量として表されます。ここで、| V | ノードの数として示されます。 この場合、すべてのノードをトラバースする必要があります。 一方、最終的なシナリオでは、すべての頂点をキューに保持する必要があるため、スペースの複雑さもO(| V |)として表されます。