幅優先探索
[Wikipedia|▼Menu]
.mw-parser-output .ambox{border:1px solid #a2a9b1;border-left:10px solid #36c;background-color:#fbfbfb;box-sizing:border-box}.mw-parser-output .ambox+link+.ambox,.mw-parser-output .ambox+link+style+.ambox,.mw-parser-output .ambox+link+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+style+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+link+.ambox{margin-top:-1px}html body.mediawiki .mw-parser-output .ambox.mbox-small-left{margin:4px 1em 4px 0;overflow:hidden;width:238px;border-collapse:collapse;font-size:88%;line-height:1.25em}.mw-parser-output .ambox-speedy{border-left:10px solid #b32424;background-color:#fee7e6}.mw-parser-output .ambox-delete{border-left:10px solid #b32424}.mw-parser-output .ambox-content{border-left:10px solid #f28500}.mw-parser-output .ambox-style{border-left:10px solid #fc3}.mw-parser-output .ambox-move{border-left:10px solid #9932cc}.mw-parser-output .ambox-protection{border-left:10px solid #a2a9b1}.mw-parser-output .ambox .mbox-text{border:none;padding:0.25em 0.5em;width:100%;font-size:90%}.mw-parser-output .ambox .mbox-image{border:none;padding:2px 0 2px 0.5em;text-align:center}.mw-parser-output .ambox .mbox-imageright{border:none;padding:2px 0.5em 2px 0;text-align:center}.mw-parser-output .ambox .mbox-empty-cell{border:none;padding:0;width:1px}.mw-parser-output .ambox .mbox-image-div{width:52px}html.client-js body.skin-minerva .mw-parser-output .mbox-text-span{margin-left:23px!important}@media(min-width:720px){.mw-parser-output .ambox{margin:0 10%}}

この記事は検証可能参考文献や出典が全く示されていないか、不十分です。出典を追加して記事の信頼性向上にご協力ください。(このテンプレートの使い方
出典検索?: "幅優先探索" ? ニュース ・ 書籍 ・ スカラー ・ CiNii ・ J-STAGE ・ NDL ・ dlib.jp ・ ジャパンサーチ ・ TWL(2015年10月)
.mw-parser-output .pathnavbox{clear:both;border:1px outset #eef;padding:0.3em 0.6em;margin:0 0 0.5em 0;background-color:#eef;font-size:90%}.mw-parser-output .pathnavbox ul{list-style:none none;margin-top:0;margin-bottom:0}.mw-parser-output .pathnavbox>ul{margin:0}.mw-parser-output .pathnavbox ul li{margin:0}探索 > 幅優先探索

幅優先探索
Order in which the nodes get expanded
探索順
一般的な情報

分類:探索アルゴリズム
データ構造:グラフ
時間計算量: O ( 。 E 。 ) {\displaystyle O(|E|)}
空間計算量: O ( 。 V 。 ) {\displaystyle O(|V|)}
最適:はい
完全:はい

ドイツの都市間の接続を示した例フランクフルトから幅優先検索を行った場合にできる木構造

幅優先探索(はばゆうせんたんさく、: breadth first search)はグラフ理論(Graph theory)において木構造(tree structure)やグラフ(graph)の探索に用いられるアルゴリズム。アルゴリズムは根ノードで始まり隣接した全てのノードを探索する。それからこれらの最も近いノードのそれぞれに対して同様のことを繰り返して探索対象ノードをみつける。「横型探索」とも言われる。

幅優先探索は解を探すために、グラフの全てのノードを網羅的に展開・検査する。最良優先探索とは異なり、ノード探索にヒューリスティクスを使わずに、グラフ全体を目的のノードがみつかるまで、目的のノードに接近しているかどうかなどは考慮せず探索する。
アルゴリズム
根ノードを空のキューに加える。

ノードをキューの先頭から取り出し、以下の処理を行う。

ノードが探索対象であれば、探索をやめ結果を返す。

そうでない場合、ノードの子で未探索のものを全てキューに追加する。


もしキューが空ならば、グラフ内の全てのノードに対して処理が行われたので、探索をやめ"not found"と結果を返す。

2に戻る。

ノードの展開により得られる子ノードはキューに追加される。訪問済みの管理は配列セットなどでも行える。
擬似コード

v は頂点。function 幅優先探索(v) Q ← 空のキュー v に訪問済みの印を付ける v を Q に追加 while Q が空ではない do v ← Q から取り出す v を処理する for each v に接続している頂点 i do if i が未訪問 then i に訪問済みの印を付ける i を Q に追加
アルゴリズムの特徴
時間計算量

最悪の場合、幅優先探索は全ての経路を考慮に入れる必要があるので、幅優先探索の時間計算量はO(|E|)である。ここで|E|はグラフ内の辺の数である。
空間計算量

見つかったノードを全て記録する必要があるので、幅優先探索の空間計算量はO(|V|)となる。ここで|V|はグラフ内のノードの数である。または、 O ( B M ) {\displaystyle O(B^{M})} ということができる。Bは枝分かれの最大数で、Mは木の最長経路の長さ。指数関数故に、幅優先探索は大量の情報から探索する事に向かない根拠になる。
完全性

幅優先探索は完全である。つまり解が存在する場合はグラフの構造によらず、解をみつけることができる。しかしグラフが無限で探索対象の解が存在しない場合、幅優先探索は終了しない。
最適性

一般に幅優先探索は最適で、常に開始ノードと終了ノードの長さが最も少ない辺を返す。もしグラフが重みつきならば、最初のノードの隣のノードが最良のゴールとは限らないが、この問題は辺のコストを考慮に入れた均一コスト探索(Uniform cost search)で解決できる。
幅優先探索の応用

幅優先探索はグラフ理論における多くの問題を解くために使うことができる。以下は一例である。

グラフ内の全ての連結成分をみつける。幅優先探索で到達するノードの集合は初期ノードを含む最大の連結成分である。

1つの連結成分内の全てのノードをみつける。

辺の重みなしグラフの最小
全域木を求める。

辺の重みなしグラフの単一始点最短経路問題を解く。

グラフが2部グラフ(Bipartite graph)かどうかテストする。もし幅優先探索の同じ段階のノード集合に存在するノードに合流する辺があるならば、グラフには奇数長の閉路が存在し2部グラフではない。

参照透過な関数型言語の場合

参照透過関数型言語の場合は余再帰と遅延評価を使うと簡潔に書ける。下記は Scala の場合で、Scalaz の unfold が余再帰で、Stream が遅延リスト。import scala.collection.immutable.Queueimport scalaz.Scalaz.unfoldcase class Tree[T](value: T, children: Seq[Tree[T]])def breadthFirstSearch[T](root: Tree[T]): Stream[T] = unfold(Queue(root))(_.dequeueOption.map { case (tree, queue) => (tree.value, queue ++ tree.children) })
Pythonによる幅優先探索アルゴリズムの実装 import networkx as nx import collections def bfs(G): V = [ v for v in G.nodes() ] Q = collections.deque([V[0]]) searched = { v: False for v in G.nodes() } searched[V[0]] = True T = [] while len(Q) != 0: v = Q.popleft() edges = [ (v, i ) for (v, i) in G.edges(v) if not searched[i] ] for edge in edges: v, i = edge Q.append(i) T += [ (v, i) ] searched[i] = True return T
Grid 描画G = nx.grid_2d_graph(4,3)p = { v: v for v in G.nodes() }nx.draw_networkx(G, pos=p, node_color='lightgray', node_size=1300, with_labels=True)plt.axis('off')plt.show()
幅優先による探索結果描画p = { v: v for v in G.nodes() }V = [ v for v in G.nodes() ]bfst = bfs(G)DG = nx.DiGraph()DG.add_edges_from(bfst)nx.draw_networkx(DG, edgelist=bfst, pos=p, node_color='lightgray', node_size=1500, with_labels=True)plt.axis('off')plt.show()
関連項目

深さ優先探索

外部リンク

『深さ優先探索と幅優先探索』 - 高校数学の美しい物語

C++ Boost Graph Library: Breadth-First Search

Depth First and Breadth First Search: Explanation and Code










アルゴリズム
ソート

比較ソート

バブルソート

選択ソート

挿入ソート

シェルソート

クイックソート

マージソート

ヒープソート

シェーカーソート

コムソート

ノームソート

図書館ソート

イントロソート

奇偶転置ソート

線形時間ソート

鳩の巣ソート

基数ソート


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:20 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef