[解決済み] 隣接リスト表現の時間複雑性?
2022-02-16 07:20:49
質問
隣接リストの表現について、このリンク先を調べています。
http://www.geeksforgeeks.org/graph-and-its-representations/
以下のようなコードの一部に、簡単な疑問があります。
// A utility function to print the adjacenncy list representation of graph
void printGraph(struct Graph* graph)
{
int v;
for (v = 0; v < graph->V; ++v)
{
struct AdjListNode* pCrawl = graph->array[v].head;
printf("\n Adjacency list of vertex %d\n head ", v);
while (pCrawl)
{
printf("-> %d", pCrawl->dest);
pCrawl = pCrawl->next;
}
printf("\n");
}
}
というのは、ここではすべての
V
というループが実行されます。
d
回である。ここで、dは各頂点の次数である。
だから、時間的な複雑さは、まるで
d0 + d1 + d2 + d3 ....... +dV where di is the degree of each vertex.
これらすべての合計はO(E)ですが、リンク先では時間の複雑さはO(|V|+|E|)とあります。
何が問題で理解できていないのかがわからない。何かお手伝いできることはないでしょうか。
どのように解決するのですか?
ここで重要なのは、時間の複雑さが成立するためには、あらゆる可能な状況をカバーする必要があるということです。
-
外周ループはグラフ構造に関係なくO(|V|)実行される。
- 仮にエッジが全くなかったとしても、外周ループを1回繰り返すごとに、一定数の演算(O(1))をしなければならない
- 内部ループは各エッジに対して1回ずつ実行されるため、O(deg(v))回となる(deg(v)は現在のノードの次数を表す)。
- したがって、外側ループの1回の反復の実行時間はO(1 + deg(v))である。なぜなら、deg(v) が 0 であっても、その繰り返しで何らかの作業をする必要があるからです。
- これらをまとめると、実行時間はO(|V| * 1 + deg(v1) + deg(v2) + ...) = O(|V| + |E|)となります。
前述したように、|E|はむしろ小さくすることが可能で、その場合でも は、外側のループだけで行われる仕事を考慮する必要があります。従って、単純に|V|項を削除することはできない。
関連
-
[解決済み】決定木(比較ソートアルゴリズム)の葉の最短の深さ)
-
[解決済み] 最小スパニングツリーは負の重みを恐れているのか?
-
[解決済み] 素朴な」アルゴリズムとは何か、「閉じた」解とは何か?
-
[解決済み] Octave : ロジスティック回帰 : fmincg と fminunc の違い
-
[解決済み] グラフの隣接リスト表現の空間複雑性
-
[解決済み] 線形時間でのソート?[クローズド]
-
[解決済み] アルゴリズムと関数の違いは何ですか?[クローズド]
-
[解決済み] T = {<M> | Mはwを受け入れるときはいつでも$w^R$を受け入れるTMである}とする。Tが決定不可能であることを示せ
-
[解決済み] Breadth First Searchの時間複雑性解析
-
[解決済み】アルゴリズムの時間複雑性を求めるには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Dijkstraのアルゴリズムが負の重みのエッジに対して機能しないのはなぜですか?
-
[解決済み】決定木(比較ソートアルゴリズム)の葉の最短の深さ)
-
[解決済み] どのようにすれば、ほとんどすべてのアルゴリズムを修正して、最良の場合の実行時間を持つようにできるか?
-
[解決済み] Octave : ロジスティック回帰 : fmincg と fminunc の違い
-
[解決済み] 2つのNFAの交点の求め方
-
[解決済み] アルゴリズムの教科書では、ソートされた配列について「増加」ではなく「非減少」を使っているのはなぜですか?
-
[解決済み] ラジアンを度数に変換する方法は?
-
[解決済み] k-meansの時間計算量はどの程度ですか?
-
[解決済み] 再帰性 T(n) = T(n^(1/2)) + 1
-
[解決済み] 二分探索木におけるk番目の最小要素を最適な方法で探す