[アルゴリズム]DFSとBFS
2233 ワード
探索する。
大量のデータの中で欲しいデータを探すプロセス.
DFSやBFSなどを選択できます.
実際,DFSとBFSを理解するためには,基本的なデータ構造スタックとキュー,および再帰関数を理解する必要がある.
資料構造とは、データを表現、管理、処理するための構造を指す.
スタックとキューは、挿入と削除で構成されます.
(その他、オーバーフローや底流なども考慮すべき)
スタック
先入後出,後入先出構造をスタックと呼ぶ.
Pythonでは、個別のライブラリは必要ありませんが、appendメソッドとpopメソッドを使用すると、スタックと同じ操作になります.
キュー
前後に貫通する先入線出口群を指す.
Python実装ではCollectionsモジュールが提供するdeque資料構造を利用する.
append()、popleft()メソッドを使用します.
Dequeオブジェクトをリストデータ型に変更する場合はlist()メソッドを使用してリストデータ型を返します.
さいきかんすう
自分の関数を再呼び出しすることを再帰関数と呼ぶ.
無限反復なので、いつ終わるかの終了条件を必ず明確にしておきましょう.
再帰関数は内部的にスタック資料構造に似ている.
グラフ#グラフ#
グラフィックはノードノードノード(頂点Vertex)と直線Edgeで表されます.
グラフィックブラウズとは、1つのノードから複数のノードにアクセスすることです.
また、2つのノードが幹線で接続されている場合は、2つのノードが隣接していることを示します.
グラフは大体2つの方法で表現できます.
INF = 9999999
garph = [
[0, 7, 5],
[7, 0, INF],
[5, INF, 0]
]
# 행이 3개인 2차원 리스트로 인접 리스트 표현
graph = [[] for _in range(3)]
# 노드 0에 연결된 노드 정보 저장(노드, 거리)
graph[0].append((1,7))
graph[0].append((2,5))
二つの方式の違い
隣接マトリクスはすべての関係を格納し、ノードが多ければ多いほどメモリが浪費されます.逆に,隣接リスト方式は接続された情報のみを格納するため,メモリを効率的に使用できる.
しかし,隣接リスト方式はこれらの属性のため,特定の2つのノードが接続されているかどうかの情報を取得する速度が遅い.
したがって、特定のノードに関連するすべての隣接ノードを巡回する必要がある場合、隣接リスト方式は隣接マトリクス方式よりもメモリ領域が少ない.
ナビゲーションアルゴリズムDFS/BFS
DFSはDepth-First探索、深さ優先探索とも呼ばれ、図形の中で深部を優先的に探索するアルゴリズムである.(できるだけ遠いノードからブラウズを開始)N個のデータがあればO(N)の時間が必要となる.
また,スタックを用いたアルゴリズムであるため,実際の実装は再帰関数を用いた場合に非常に簡潔に実現できる.
BFSの意味はbreadth First Search,幅優先ナビゲーションである.簡単に言えば,近接ノードから探索を開始するアルゴリズムである.キューアルゴリズムを使用します.
同様に,データ数がNであればO(N)の時間が必要となる.一般的に、実際の実行時間はDFSよりも優れている.
Reference
この問題について([アルゴリズム]DFSとBFS), 我々は、より多くの情報をここで見つけました https://velog.io/@roum02/알고리즘-DFS와-BFSテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol