web-dev-qa-db-ja.com

隣接リスト表現の時間の複雑さ?

隣接リストを表すためにこのリンクをたどっています。

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 whileループが実行されるときに、d回言います。ここで、dは各頂点の次数です。

時間の複雑さは

d0 + d1 + d2 + d3 ....... +dV where di is the degree of each vertex.

これはすべてO(E)を合計しますが、リンクは時間の複雑さがO(| V | + | E |)であることを示しています


理解の何が問題かわからない。ここで必要ないくつかの助け

6
Garrick

ここで重要なことは、時間の複雑さが有効であるためには、考えられるすべての状況をカバーする必要があるということです。

  • グラフの構造に関係なく、外側のループはO(| V |)で実行されます。
    • エッジがまったくない場合でも、外側のループの反復ごとに、一定数の操作(O(1))を実行する必要があります
    • 内部ループはすべてのEdgeに対して1回実行されるため、O(deg(v))回、ここでdeg(v)は現在のノードの次数です。
    • したがって、外側のループの単一の反復の実行時間はO(1 + deg(v))です。 deg(v)が0になる可能性があるため、1を省略できないことに注意してください。ただし、その反復でいくつかの作業を行う必要があります。
  • 以上をまとめると、O(| V | * 1 + deg(v1)+ deg(v2)+ ...)= O(| V | + | E |)のランタイムが得られます。

前に述べたように、| E |外側のループでのみ行われる作業を考慮する必要があるほど、かなり小さい場合があります。したがって、| V |を単純に削除することはできません。期間。

9
Tobias Ribizel