web-dev-qa-db-ja.com

深さ優先探索の時間/空間の複雑さ

私は他のさまざまなStackOverflowの回答を見てきましたが、それらはすべて私の講師が彼のスライドで書いたものとは異なります。

深さ優先検索の時間計算量はO(b ^ m)です。ここで、bは検索ツリーの最大分岐係数、mは状態空間の最大深さです。 mがdよりもはるかに大きい場合はひどいですが、検索ツリーが「ビジー」である場合は、幅優先検索よりもはるかに高速です。

彼は言い​​続けます。

空間の複雑さはO(bm)、つまりアクションシーケンスの長さが直線的な空間です!パス上の各ノードの残りの展開されていない兄弟ノードとともに、ルートからリーフノードへの単一のパスのみを保存する必要があります。

別の回答 StackOverflowでは、O(n + m)であると述べられています。

12
TheRapture87

時間の複雑さ: O(1)時間で各ノードにアクセスできる場合、分岐係数bおよび最大深度mで、ノードの総数はこのツリーは最悪の場合= 1 + b + b2 +…+ bm-1 = bm -1、bに比例して各ノードを訪問する合計時間m。したがって、複雑度= O(bm)。

一方、分岐係数と最大深度を使用する代わりに、ノードの数nがある場合、複雑さは直接言うことができますnまたはO(n)に比例する.

質問でリンクした他の答えは、同様に異なる用語を使用しています。アイデアはどこでも同じです。一部のソリューションでは、エッジカウントも追加して回答をより正確にしましたが、一般的に、ノードカウントで複雑さを説明できます。


スペースの複雑さ:最長パスの長さ= m。すべての子を訪問し、親ノードに戻ったときに、次に探索する兄弟を知ることができるように、ノードごとに兄弟を保存する必要があります。パスにあるm個のノードの場合、m個のノードごとにb個のノードを追加で保存する必要があります。これは、O(bm)スペースの複雑さを取得する方法です。

15
displayName

複雑さはO(n + m)です。ここで、nはツリー内のノードの数であり、mはエッジの数です。

先生がO(b ^ m)として複雑さを表す理由は、おそらく深さ優先検索と幅優先検索の違いを強調したいからです。

BFSを使用する場合、ツリーの深さと比較して非常に大きな広がりがあり、葉で結果が見つかると予想している場合、BFSよりも速く葉に到達するため、DFSはここで明らかにより意味があります。ただし、どちらも同じ時間(作業)で最後のノードに到達します。

ツリーが非常に深く、非葉がより深いノードに関する情報を提供できる場合、BFSは、目的を見つけるために必要なノードの量を減らすために、検索ツリーをプルーニングする方法を検出できます。明らかに、ツリーの上位でサブツリーをプルーニングできれば、より多くのノードをスキップできます。これは、ルートに近いノードを探索するよりもリーフに到達することを優先するため、DFSを使用している場合は困難です。

1
Glubus

このDFSの時間/空間の複雑さはAIクラスで教えられますが、アルゴリズムクラスでは教えられないと思います。

ここでのDFS検索ツリーの意味はわずかに異なります。

ノードは、検索ツリーを表すために使用される簿記データ構造です。状態は、世界の構成に対応します。 ...さらに、2つの異なる検索パスを介してその状態が生成される場合、2つの異なるノードに同じワールド状態を含めることができます。

「人工知能-現代のアプローチ」という本から引用

したがって、ここでの時間/空間の複雑さは、ノードにアクセスし、これが目標状態であるかどうかを確認することに焦点を当てています。 @displayNameはすでに非常に明確な説明を提供しています。

O(m + n)はアルゴリズムクラスにありますが、グラフを隣接リストとして保存し、ノードを検出する方法は、アルゴリズム自体に焦点を当てています。

1
XueYu