web-dev-qa-db-ja.com

DFSとBFSの時間計算量が、グラフの表現方法に依存するのはなぜですか?

サイト http://web.eecs.utk.edu/~huangj/CS302S04/notes/graph-searching.html は、隣接リストを使用すると、DFSとBFSの複雑さがO( V + E)であり、隣接行列が使用されている場合、複雑さはO(V2)。どうしてこれなの?

15
Nitish Jain

どちらの場合も、ランタイムは、特定のノードの発信エッジを反復処理するのにかかる時間によって異なります。隣接リストを使用すると、実行時間は発信エッジの数に正比例します。各ノードは1回訪問されるため、コストはノードの数とエッジの数の合計であり、O(m + n)です。隣接行列を使用すると、ノードの行のn列すべてを検査する必要があるため、すべての発信エッジを見つけるのに必要な時間はO(n)です。nノードすべてを合計すると、これは機能します。 O(n2)。

お役に立てれば!

24
templatetypedef

DFSとBFSの両方の時間計算量は、次のように計算できます。

すべての頂点とそれに対応する入射エッジを1回反復するなので、合計時間計算量は->

時間計算量= v1 +(v1のincident_edges)+ v2 +(v2のincident_edges)+ ...... + vn +(vnのincident_edges)

これで、これを->(v1 + v2 + v3 + ..... vn)+(v1のincident_edges + v2のincident_edges + ..... vnのincident_edges)として再グループ化できます。

したがって、合計時間計算量は=(v1 + v2 + v3 + ..... vn)+(v1のincident_edges + v2のincident_edges + ..... vnのincident_edges)になります。

(v1 + v2 + ... + vn)= Vまたはn(頂点の総数)

隣接リスト表現の場合:

(v1のincident_edges + v2のincident_edges + ..... vnのincident_edges)= E(エッジの総数)

したがって、隣接リスト表現の場合、時間計算量はO(V + E)になります。

隣接行列表現の場合:

対応するノード(行)の隣接ノードにアクセスするには、特定の行のすべての列を反復する必要があります。これはVになります。

したがって、(v1のincident_edges + v2のincident_edges + ..... vnのincident_edges)= V + V + .... V番目の時間V)= V * V

したがって、時間計算量はO(V + V ^ 2)= O(V ^ 2)になります。

0
Vimal Kumar

探索に必要な各頂点時間を探索する場合、それはc * xに等しいことに注意する必要があります。ここで、xは頂点の次数です。全体的な複雑さを見つけることに関心があるため、全体の時間はc1 * x1 + c2 *になります。 x2 ... cn nノードの場合はxn。max(ci dを取ると、全体の時間は<= d)==(すべての頂点の度の合計)= d * 2m = O( m)ここでは、1つの頂点ではなく、すべての頂点をまとめた時間を計算しましたが、キューイング操作には時間O(n)がかかるため、全体としてO(n + m)になります。

0
aman khunt