キューをBFS実装のスタックに変更すると、DFSを取得できますか?


35

次に、幅優先検索の標準的な擬似コードを示します。

{ seen(x) is false for all x at this point }
push(q, x0)
seen(x0) := true
while (!empty(q))
  x := pop(q)
  visit(x)
  for each y reachable from x by one edge
    if not seen(y)
      push(q, y)
      seen(y) := true

ここpushpopは、キュー操作であると想定されています。しかし、スタック操作の場合はどうでしょうか?結果のアルゴリズムは、深さ優先順で頂点を訪問しますか?


「これは取るに足らない」というコメントに投票した場合、なぜそれが取るに​​足らないのかを説明してください。この問題は非常に注意が必要です。


5
学生がこれに苦労しているのを見てきたので、それが厳密に単純すぎるとは思わない。しかし、答えには「はい」または「いいえ」以上のものを含める必要がありますか?目的の粒度は質問から明らかではありません。
ラファエル

2
「はい」には説得力のある議論が伴います。「いいえ」には反例があります。しかし、何が起こっているかを理解したら、yes / noよりも良い答えがあります
...-rgrig


3
擬似コードを記述しpopて、スタックまたはキュー操作に変更するだけで、dfsまたはbfsを取得することができます。また、最初はこれが真実であると思われる擬似コードを書くのは簡単ですが、そうではありません。 ics.uci.edu//~eppstein/161/960215.html は関連するリファレンスです。
ジョー

回答:


23

いいえ、これはDFSとは異なります。

グラフを考える

ここに画像の説明を入力してください

ノードを右から左の順序でプッシュすると、アルゴリズムはトラバーサルを提供します。

ABECD

一方、DFSは

ABEDC

ΘV+EOV

私は同意します、問題は些細なことではありません。


5
これは、隣接リストに特定の固定された順序があることを前提としています。少なくとも数学では、それらをセットと見なし、グラフには、子を反復する方法に応じて、複数の深さ方向のトラバースがあります。(子供にハッシュを使用することを想像してください。)その意味で、ABECDは依然として深さ優先です。質問者は、この設定でも反例があるかどうか疑問に思います。(実際、これはトリッキーになり始めるところです。)
rgrig

3
DED

1
@Arybhata:ああ、すみません、なぜあなたはエッジが下向きに向けられているのだと思っていたのかわからないのです。彼らは無向なので、あなたは正しいです。これは私がコメントで言っていたことの反例です。(これは奇妙です。ハンドルのスペルを間違えたため、SEによって削除されません。)
rgrig
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.