以下のアルゴリズムの時間計算量を確認したいだけです。
編集:以下では、最適なデータ構造が使用されているとは想定していません。ただし、そのような構造を使用するソリューションを自由に提案してください(使用されるデータ構造と、それらが複雑さに与える有益な影響について明確に言及してください)。
表記法:以下では、n = | V |、m = | E |、およびavg_neighは、グラフ内の任意のノードの隣接ノードの平均数を示します。
仮定:グラフは重み付けされておらず、無向であり、隣接リスト表現がメモリにロードされています(各頂点の隣接リストを含むリストのリスト)。
これが私たちがこれまでに持っているものです:
1行目:次数の計算はO(n)です。これは、隣接リスト表現の各サブリストの長さを取得する、つまりn個のO(1)操作を実行するだけだからです。
3行目:最小値を見つけるには、すべての値、つまりO(n)をチェックする必要があります。これは、すべてのノードに1回アクセスするwhileループにネストされているため、O(n ^ 2)になります。
6〜7行目:隣接リスト表現からvの隣接リストがわかっているため、頂点vの削除はO(avg_neigh ^ 2)であり、隣接リストの各サブリストからvを削除するのはO(avg_neigh)です。6〜7行目はwhileループにネストされているため、O(n * avg_neigh ^ 2)になります。
9行目:1つのリストの長さを取得するだけなので、O(1)です。forループとwhileループにネストされているため、O(n * avg_neigh)になります。
要約:全体の複雑さはO(n)+ O(n ^ 2)+ O(n * avg_neigh ^ 2)+ O(n * avg_neigh)= O(n ^ 2)です。
注1:各サブリストの長さが利用できない場合(たとえば、隣接リストをメモリにロードできないため)、各リストには平均してavg_neigh要素が含まれているため、1行目の次数の計算はO(n * avg_neigh)です。 n個のサブリストです。そして9行目では、複雑さの合計はO(n * avg_neigh ^ 2)になります。
注2:グラフに重みが付けられている場合、隣接リスト表現にエッジの重みを格納できます。ただし、1行目の度数を取得するには、各サブリストを合計する必要があり、隣接リストがRAMにロードされている場合はO(n * avg_neigh)になり、それ以外の場合はO(n * avg_neigh ^ 2)になります。同様に、9行目はO(n * avg_neigh ^ 2)またはO(n * avg_neigh ^ 3)になります。
(1)アルゴリズム1の実装として認識可能であり、(2)時間O(| E | + | V |)で実行されるアルゴリズムがあります。
まず、アルゴリズム1の本質を考えてみましょう。グラフが空になるまで、次の手順を実行します。優先度が最も低いノードの優先度をそのノードのコア番号として記録し、そのノードを削除します。ノードの優先度は、(1)残差グラフでのその次数、および(2)削除された隣接ノードのコア数に対する最大値として動的に定義されます。ノードの次数が上がることはなく、優先度の高いネイバーが最初に削除されないため、ノードの優先度が上がることはないことに注意してください。また、優先順位は、外側のループの反復ごとに常に1つずつ減少します。
O(| E | + | V |)時間を達成するのに十分なデータ構造サポートは、
初期グラフ(初期化時間O(| E | + | V |))から開始してサポートするグラフ
初期度(初期化時間O(| V |))から開始して、サポートする優先度キュー
適切なグラフの実装では、二重にリンクされた隣接リストを使用します。各無向エッジには、2つの対応するリストノードがあり、同じ頂点から発生する前/次のノードに加えて、互いにリンクされています。度はハッシュテーブルに保存できます。このアルゴリズムを実装するために必要なのは残余度のみであることが判明したため、残余グラフをわざわざ保存しないでください。
優先順位は0から| V |までの数字なので -1、バケットキューは非常にうまく機能します。この実装は、二重にリンクされたリストの| V |要素ベクトルで構成されます。ここで、インデックスpのリストには、優先度pの要素が含まれています。また、キュー内の要素の最小優先度の下限も追跡します。最小優先度要素を見つけるために、この境界から順にリストを調べます。最悪の場合、これにはO(| V |)のコストがかかりますが、アルゴリズムが限界を増やすたびに貸方に記入し、限界が減少するたびに借方に記入すると、このスキャンの変動費を相殺する償却スキームが得られます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加