「深さ優先探索」の版間の差分

削除された内容 追加された内容
Ertyupoi (会話 | 投稿記録)
編集の要約なし
Ertyupoi (会話 | 投稿記録)
反復深化深さ優先探索 2015年2月25日 (水) 03:15‎ へ移動
78行目:
== 反復深化深さ優先探索 ==
{{main|反復深化深さ優先探索}}
メモリに載りきらないような大規模な木を探索する場合、深さ優先探索は探索木のパスの長さが長くなりすぎて探索が終わらないという問題を抱えている。「訪れたノードを記憶する」という単純な方法は、十分なメモリ量がない場合通用しなくなるのである。また、探索対象が木ではなく一般の有向グラフである場合(特に、ループを含む場合)にも同じ問題が起こる。これは、木の深さを段階的に増やして探索する[[反復深化深さ優先探索]]で解決することができる。
 
下記の図を用いた場合、
 
[[ファイル:graph.traversal.example.png]]
 
グラフの左にある辺が右にある辺より先に選択され、以前訪れたノードを記憶することにより再訪しないとするならば、Aからスタートした深さ優先探索はA, B, D, F, E, C, Gという順番で訪れる。
 
ここで以前訪れたノードを記憶していない場合、A, B, D, F, E, A, B, D, F, Eと、A, B, D, F, Eのループに捕まって永遠にCやGに到達することはできない。
 
反復深化はこのループを回避し、上記のように左から右に探索が進むとすると、下記の深さにおいて下記のノードに到達する。
 
*0: A
*1: A (repeated), B, C, E
(反復深化はCをみつけていることに注意。通常の深さ優先探索では見つからない。)
*2: A, B, D, F, C, G, E, F
(以前Cを見つけていることに注意。Eを別のパスでみつけていることとFでループを見つけていることにも注意。)
*3: A, B, D, F, E, C, G, E, F, B
 
このグラフでは深さを増やしていくたびに、アルゴリズムが探索を断念して他の枝に行くまで"ABFE", "AEFB"のループが長くなる。
 
== 関連項目 ==