深さ優先探索(DFS: Depth-First Search)は、グラフや木構造を探索するための基本的なアルゴリズムの一つです。DFSは、あるノードから始め、隣接するノードを訪問しながら可能な限り深く進んでいく手法です。すべてのノードを訪問するまで、再帰的またはスタックを使用して探索を続けます。
DFSは以下のような多くの用途があります。
DFSの実装は、再帰的アプローチと非再帰的アプローチの2つがあります。ここでは、両方の方法を示します。
以下のコードは、再帰を使ったDFSの実装です。
def dfs_recursive(graph, start, visited=None):
if visited is None:
visited = set()
visited.add(start)
print(start)
for neighbor in graph[start]:
if neighbor not in visited:
dfs_recursive(graph, neighbor, visited)
return visited
# グラフの定義(隣接リスト)
graph = {
'A': ['B', 'C'],
'B': ['A', 'D', 'E'],
'C': ['A', 'F'],
'D': ['B'],
'E': ['B', 'F'],
'F': ['C', 'E']
}
# DFSの実行
dfs_recursive(graph, 'A')
dfs_recursive
関数は、グラフ、開始ノード、および訪問済みノードの集合を引数とします。visited
というセットを使用します。次に、非再帰的なDFSを実装します。この方法では、スタックを使用します。
def dfs_iterative(graph, start):
visited = set()
stack = [start]
while stack:
vertex = stack.pop()
if vertex not in visited:
visited.add(vertex)
print(vertex)
stack.extend(neighbor for neighbor in graph[vertex] if neighbor not in visited)
return visited
# DFSの実行
dfs_iterative(graph, 'A')
dfs_iterative
関数は、グラフと開始ノードを引数とします。visited
というセットと、探索するノードを保持するスタックを使用します。深さ優先探索(DFS)は、グラフや木構造を探索するための強力なアルゴリズムです。再帰的および非再帰的な方法で実装でき、さまざまな問題に応用可能です。 DFSを理解することで、より複雑なアルゴリズムや問題解決に進むための基礎を築くことができます。