[WIL] DFS & BFS
今週習った
💡 그래프란, 정점과 정점을 연결하는 간선으로 이루어진 자료구조이고 아래는 그래프의 탐색 방법이다.
DFS (Depth First Search)
深さ優先検索は、ルートノード(または任意のノード)から開始し、左または右から次のブランチ(ブランチ)に移動する前に、ブランチを完全(最大深さ)に検索します.
DFS時間複雑度
DFS実装
# DFS - 재귀호출 구현
# 방문한 내용이 초기화되지 않게 인자로 넘겨주는 것이다.
def dfs_recursive(start_v, visited):
visited.append(start_v)
for adj in graph[start_v]:
if adj not in visited:
# 해당 재귀호출에서 업데이트된 visited를 다시 인자로 넘겨준다.
dfs_recursive(adj, visited)
return visited
# [1, 2, 5, 6, 7, 3, 4] 재귀호출 결과
# DFS - 스택으로 구현
def dfs_stack(start_v):
visited = []
# 방문할 순서를 담아두는 용도
stack = [start_v]
while stack:
# 제일 최근에 삽입된 노드를 꺼내고 방문처리 한다.
top_v = stack.pop()
visited.append(top_v)
# 인접 노드가 visited에 stack에 쌓고 계속 반복문이 돌게 만들어준다.
for adj in graph[top_v]:
if adj not in visited:
stack.append(adj)
return visited
# [1, 4, 3, 5, 7, 6, 2] 스택 결과
BFS (Breadth First Search)
[幅](Width)優先的に検索します.ルートノード(または任意のノード)から開始し、まず現在の頂点付近のノードを検索します.
2つのノード間の最短経路または任意の経路を探す必要がある場合、BFS方式が使用される.
BFS時間複雑度
BFSの実装
from collections import deque
# BFS - deque를 이용하여 큐로 구현
def bfs_queue(start):
# 시작 노드를 방문 처리한다.
visited = [start]
# 큐를 만들고 시작 노드를 담아준다.
q = deque([start])
# 큐가 빌 때까지 반복된다.
while q:
node = q.popleft()
for adj in graph[node]:
# 인접 노드가 방문하지 않은곳이라면, 방문 처리와 큐에 쌓아준다.
if adj not in visited:
q.append(adj)
visited.append(adj)
return visited
# [1, 2, 3, 4, 5, 6, 7] BFS 결과물이다.
📌 振り返る
DFSとBFSに直面するのは初めてで、これが本当のアルゴリズムだと感じた1週間でした.
最初は概念を理解して、例を見てから問題を解いて、今から見ればこのようにするのはあまり意味がなくて、理解してから転向して、問題の答えを見て、理解して、このようにして過ぎて、今週の目標になりました.
集中力が限界に達した時、私の主な言語JavaScriptを見て、ここでまた衝撃を受けました.
JSは私の主な言語で、数週間のPythonを使って、JSファイルの中で私がPythonの文法を使っているのを見て、振り返ってみると、私はただ勉強しているだけで、実際には自分の両手で多くのコードを書いたことがありません.
残りのアルゴリズム期間中は,アルゴリズムと主力言語の付加学習時間を割り当てるべきである.
Reference
この問題について([WIL] DFS & BFS), 我々は、より多くの情報をここで見つけました https://velog.io/@llama/WIL-DFS-BFSテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol