DFS、再帰、反復スタック
深く探索し、再帰制限を回避します
「DFS、再帰、反復スタック」はCoddyKit上の無料Coding Interview Prepレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCoding Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Coding Interview Prepコースには全4レッスンが含まれています。
DFSの動作
DFSは1つの経路を進めるだけ深く進み、その後戻って次の経路を試します。迷路を通路ごとに探索するイメージです。🧭
DFSとBFSの違い
BFSが同心円状に広がるのに対し、DFSはまず深く進みます。どちらも到達可能なすべてのノードを訪れますが、順序が大きく異なります。
再帰の形
再帰的なDFSでは、ノードをvisitedにしてから、未訪問の各隣接ノードに対して自分自身を呼び出します。コールスタックが戻る場所を記憶します。
def dfs(u):
visited[u] = True
for v in adj[u]:
if not visited[v]:
dfs(v)再帰する前にマークする
隣接ノードを探索する前、ノードに入った時点でvisitedを設定します。そうしないと、サイクルによってDFSが無限再帰に陥ります。
再帰制限の罠
Pythonの再帰呼び出しは約1000回に制限されています。深いグラフではRecursionErrorが発生し、実行時エラーと判定されます。
制限を引き上げる
手早い対処法の1つは、setrecursionlimitで上限を引き上げることです。DFSを実行する前に、最悪の場合の深さより大きな値を設定してください。
import sys
sys.setrecursionlimit(300000)代わりに反復処理を使う
最も安全な対処法は、自分で用意したスタックを使う反復的なDFSです。呼び出しの深さがなくなるため、再帰によるクラッシュも起きません。
stack = [start]スタックから取り出す
各ステップでスタックの一番上から取り出します。後入れ先出しによって、直近の経路を優先して深く進めます。
u = stack.pop()隣接ノードを追加する
uを取り出した後、未訪問の各隣接ノードをスタックに追加します。再び追加しないよう、追加時にマークします。
for v in adj[u]:
if not visited[v]:
visited[v] = True
stack.append(v)反復処理の完全なループ
スタックにノードがある間、取り出しと追加を繰り返します。空になったとき、到達可能なすべてのノードを訪問したことになります。
while stack:
u = stack.pop()
for v in adj[u]:
if not visited[v]:
visited[v] = True
stack.append(v)BFSと同じ計算量
BFSと同様に、DFSも各ノードと各エッジを1回ずつ訪れるため、計算量はO(n + m)です。問題に適した探索順序で選んでください。
確認問題
深いグラフで再帰的なDFSがクラッシュしました。なぜでしょうか。
復習
DFSは再帰または自分で用意したスタックを使って実行できます。入った時点で訪問済みにし、グラフが深い場合は反復処理に切り替えます。🎉
よくある質問
「DFS、再帰、反復スタック」レッスンは無料ですか?
はい。「DFS、再帰、反復スタック」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Coding Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Coding Interview Prepコースには全4レッスンが含まれています。
「DFS、再帰、反復スタック」で何を学びますか?
深く探索し、再帰制限を回避します ブラウザで直接実行するハンズオンコードでCoding Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Coding Interview Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCoding Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「DFS、再帰、反復スタック」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCoding Interview Prepレッスンでコードを書いて実行できますか?
はい。すべてのCoding Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 入力から隣接リストを作る
- 重みなし最短経路のための BFS
- DFS、再帰、反復スタック
- 連結成分と Flood Fill