幅優先検索での「幅」の意味は何ですか?


11

私は幅優先検索について学んでいて、なぜBFSがそう呼ばれるのかという疑問が頭に浮かびました。「CLRSによるアルゴリズムの紹介」の本で、私はこれについて次の理由を読みました。

幅優先探索は、発見された頂点と発見されていない頂点の間の境界を、境界の幅全体に均一に拡張するため、このように呼ばれています。

しかし、私はこの発言の意味を理解することができません。私はこの「フロンティア」という言葉とそのフロンティアの幅について混乱しています。

それで、私のような初心者にとって理解しやすい方法でこの質問に誰かが答えてもらえますか?


4
一部の読者が英語の単語の意味に慣れていない場合(この専門用語の一部としての用法以外):merriam-webster.com/dictionary/breadthまたはdictionary.cambridge.org/dictionary/english/breadth。物理的なオブジェクトのサイズ/形状について話している場合、「幅」に似ており、「深さ」とは次元が異なります。そして、比喩的な意味では、知識の深さ(1つの主題についての専門家)と知識の幅(多くの主題について)を比較します。
Peter Cordes

回答:


22

検索を表すために使用されるデータ構造を検討してください。BFSでは、キューを使用します。見えないノードに遭遇した場合は、それをキューに追加します。

「フロンティア」は、検索データ構造内のすべてのノードのセットです。キューは、フロンティアのすべてのノードを順番に反復するため、フロンティアの全体で反復します。DFSは常に、スタックから最新で発見された状態をポップするため、常にフロンティアの最も深い部分を繰り返し処理します。

以下の画像を検討してください。DFSがツリーの最も深い部分にまっすぐ進むのに対して、BFSは各レベルの幅を反復することに注意してください。

DFS BFS

画像はこちら


2
フロンティアという言葉は、発見されたノードのエッジを指すかもしれません。あなただけを発見したaとき、フロンティアはaです。あなたが発見したときはabc、フロンティアがありますbc。あなたが発見したときはabcdefg、フロンティアはdefg。言い換えると、発見されたノードで、まだ探索していないノードです。
Theodoros Chatzigiannakis

これは公平な点だと思いますが、「フロンティア」は複数の方法で解釈でき、上記の一般的な説明はまだ機能していると思います。
Throckmorton

2

あなたが与える引用は「発見された頂点と発見されていない頂点の間のフロンティア」を言います。それが、著者が話しているフロンティアです。発見された頂点と発見されていない頂点の間のフロンティアです。まだ何も表示されていない頂点がいくつかあります。また、すべてを見た頂点がいくつかあります。そして、その間に頂点があります。これらは確認した頂点ですが、まだすべての子をロードしていません。これがフロンティアです。

では、これについてさらに詳しく説明します。

進行状況を追跡するために、BFSは各頂点を白、灰色、または黒に色付けします。すべての頂点は白で始まり、後で灰色になり、次に黒になることがあります。頂点は、検索中に最初に検出されたときに発見され、そのときに非白になります。したがって、グレーとブラックの頂点が発見されましたが、BFSはそれらを区別して、BFの方法で検索を続行します。
...
各頂点は最初は白で、検索で発見されると灰色になり、終了すると、つまり隣接リストが完全に調べられると黒になります。

したがって、すべての頂点は白で始まります(未検出)。ノードが検出されると、その色は灰色(フロンティア)になります。それが指すすべてが発見されると、それは黒く着色されます(完全に発見されます)。フロンティアとは、発見されたが発見されていない子供がいる一連のポイントです。

ウェブサイトで何かを探しているとしましょう。最初にメインページに移動します。「動物」というラベルが付いているとします。フロンティアは現在{"animals"}です。メインページを調べても、探しているものが表示されません。しかし、「四足歩行」と「ワーム」の2つのページへのリンクがあることに気付きました。そこで、「四足歩行」へのリンクをクリックします。現在、フロンティアは{"animals"、 "quadrupeds"}です。「四足歩行」を調べても、探しているものが見つからない。次に何をしますか?「四足動物」のリンクを探してそれに従うか、「動物」に戻って「ワーム」へのリンクをクリックします。1つ目は深さ優先検索で、2つ目は幅優先検索です。

「深さ」とは、ルートノードからノードに到達するために必要なリンクの数を指し、「幅」とは、同じ深さのノードを指します。上記の例では、BFSは「動物」から始まり、最初に深さ1のすべてのノードを調べるため、「四足動物」と「ワーム」を最初に調べます。すべてのdepth-1ノードを調べた後、すべてのノードにわたってフロンティアを拡張します。つまり、すべてのdepth-1ノードの子を調べてから、depth-2ノードの子を調べます。したがって、たとえば、「四足動物」ページのリンクの1つが「霊長類」である場合、「霊長類」ページのリンクを確認する前に、「ワーム」ページのすべてのリンクを確認します。


1

aaa2a

常に、波のフロンティアは、キューデータ構造に格納されている頂点です(これらの頂点は、訪問済みですが、まだ探索されていません)。

aa

kaka(k0)0{a}aa

aaa

したがって、DFSとBFSは、頂点にアクセスする順序が異なります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.