DFSがスペースの複雑さを持っていると見なされるのはなぜですか?


11

これらのメモによると、DFSは空間の複雑さを持っていると見なされます。ここで、はツリーの分岐係数であり、は状態空間内のパスの最大長です。b mO(bm)bm

同じことがUninformed SearchのこのWikibookページでも述べられています

現在、DFSに関するWikipediaの記事の「情報ボックス」は、アルゴリズムのスペースの複雑さについて次のことを示しています。

O O(|V|)、繰り返しなしでグラフ全体をトラバースする場合、重複ノードを排除せずに、暗黙的グラフの検索された最長経路長O()

これは、DFSのスペースの複雑さ、つまりであると私が考えたものにより似ています。ここで、はアルゴリズムが到達する最大長です。mO(m)m

なぜこれが事実だと思いますか?

まあ、基本的には、現在見ているパスのノード以外のノードを保存する必要はないので、Wikibookと私が紹介したメモの両方が提供する分析でを掛けても意味がありません。に。b

さらに、Richard KorfによるIDA *に関するこの論文によると、DFSのスペースの複雑さはであり、は「深度カットオフ」と見なされます。dO(d)d

では、DFSの正しいスペースの複雑さは何ですか?

それは実装に依存すると思うので、異なる既知の実装のスペースの複雑さの説明をいただければ幸いです。


DFS is considered to […] of the tree最初に深さをたどるすべてのグラフツリーであるとは限りません。
greybeard 2017年

「ここではDFSの実装にはXのコストがかかる」と「DFSはXのコストになるように実装できる」と言うことには違いがあります。したがって、まったく矛盾する必要のない、第2種の異なるステートメントについて議論しているようです。(が何かを意味する場合、以来、まったく矛盾がないことに注意してください。)O BのM O(bm)O(m)O(bm)
ラファエル

@greybeardグラフの深さ優先トラバーサルがツリーにならない例を教えてください。
nbro

example where a depth-first traversal on a graph would not result in a treeあまり考えずに:解析。(待機:どういう意味result in a treeですか??質問はグラフの検索/トラバースについてです。)
greybeard

1
@greybeardこれまでに見つけたすべての定義によると。ノードを再検討する定義を見つけたら、それについて話し合います。
nbro 2017年

回答:


7

それはまさにあなたがDFSと呼ぶものに依存します。たとえば、Wikipediaで説明されているアルゴリズムDFS-iterative を考えてみましょう。ツリーで実行すると、どのノードに既にアクセスしたかを追跡する必要がなくなります。深さ完全な aryツリーで実行するとします。ツリー内のノードは、最大の長さのを超える単語で識別できます。アルゴリズムは次のように動作します。m [ b ] mbm[b]m

  1. ルートから始めます。をスタックにプッシュします(逆順)。1,2,,b

  2. ポップし、をスタックにプッシュします。11 12 ... 1件のB111,12,,1b

  3. ポップし、をスタックにプッシュします。111 112 ... 11 B11111,112,,11b

  4. ポップし、をスタックにプッシュします。 1 m1 m 1 2 1 m 1 b1m11m,1m12,,1m1b

この時点で、スタックには

1m,1m12,,1m1b,,112,,11b,12,,1b,2,,b,

合計ノード。これがスタックのサイズが最大化された時点でのパイントであることを確認できます。(b1)m+1


2
時間のパイントは医者を遠ざけます。
greybeard 2017年

3

ここで、2つのポイントを作成します。

  1. 現在のノードのすべての子孫をスタックに導入する場合、スペースの複雑度はここで、は分岐係数、は最大長です。ユヴァル・フィルムスの回答は確かにこの事件に言及している。ただし、一般にはよりはるかに大きいことに注意してください。さらに、スライディングタイルパズルなどの多くのドメインでは、は定数(その特定のケースでは4)によって上限が設定されているため、DFSの空間複雑度はあると言えます。O(bd)bddbbO(d)

  2. 確かに、しかし、これは常にそうではありません。たとえば、パンケーキパズルでは、分岐係数は最適解の長さとともに増加し、どちらも同じような値になります。それでも、空間の複雑さはです。これを確認するには、任意のノードの展開手順を調整するだけです。現在のノードのすべての子孫を挿入する代わりに(Yuval Filmusによって提案されているように)、それらを順番に挿入します。最初に最初の子孫を生成し、すぐに深さ優先順で続行した -実際には、この時点で他のすべての子孫は必要ありませんO(d)。このノードに戻る場合は、その子孫がスタックから削除されています。次に、2番目の子孫を生成し、深さ優先順で再び先に進みます。このノードにバックトラックする場合は、子孫がなくなるまで3番目以降を生成します。この方法を続行すると、分岐因数関係なく、スタックには個のノードしかありません。db

要約すると、DFSの空間複雑度はとは決して言えません。代わりに、その空間複雑度はであると主張します。O d O(bd)O(d)

お役に立てれば、

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