グラフ理論における最小全域木(MST)グラフのとそしては、それはすべての頂点を含み、かつ最小の重みを持つ。
最小全域木(MST)は、実用的および理論的な幅広い分野で活用されている、有用かつ汎用性の高いツールです。例えば、単一の倉庫から複数の店舗に特定の商品を供給しようとする企業は、倉庫を起点とするMSTを用いて、各店舗への最短経路を計算することができます。この場合、店舗と倉庫は頂点として、それらの間の道路接続は辺として表されます。各辺には、対応する道路接続の長さがラベル付けされます。
もしエッジ重みなしの場合、すべての全域木は同じ数のエッジを持ち、したがって同じ重みを持ちます。エッジ重み付きの場合、すべての全域木の中でエッジの重みの合計が最も小さい全域木が、これは最小全域木(MST)と呼ばれます。必ずしも一意であるとは限りません。より一般的には、必ずしも連結ではないグラフには最小全域森が存在し、これは各連結成分のMSTの和集合で構成されます。
MST の探索はグラフ理論において広く行われている問題であるため、それを解くための逐次アルゴリズムが数多く存在する。その中には、プリムのアルゴリズム、クラスカルのアルゴリズム、ボルフカのアルゴリズムなどがあり、それぞれ MST の異なる特性を利用している。これらはすべて同様の方法で動作する。有効な MST が見つかるまで反復的に拡張されます。しかし、実際の問題はしばしば非常に大規模であるため (道路ネットワークには数十億のエッジがある場合もあります)、パフォーマンスが重要な要素となります。これを改善するオプションの 1 つは、既知のMST アルゴリズムを並列化することです。[ 1 ]
このアルゴリズムは、最小全域木(MST)のカット特性を利用します。以下に、簡略化された高レベルの擬似コードによる実装例を示します。
どこはランダムな頂点です繰り返すタイムズ 最も軽いエッジを見つけるstしかしTを返す
各辺は正確に 2 回観測されます。つまり、各端点を調べるときに観測されます。各頂点は正確に 1 回だけ観測され、合計で各ループ反復における最軽量エッジの選択以外の操作。この選択は、優先度付きキュー(PQ)を使用して実行されることが多い。各エッジに対して、最大で 1 つの decreaseKey 操作(償却済み))が実行され、各ループ反復で 1 つの deleteMin 操作が実行されます(したがって、フィボナッチヒープを使用すると、プリムのアルゴリズムの総実行時間は漸近的に。
ループは本質的に逐次的であり、適切に並列化できないことに注意することが重要です。これは、1 つのエンドポイントを持つ最も軽いエッジがそしてさらにエッジの追加により変化する可能性がありますしたがって、最も軽いエッジの選択を2つ同時に行うことはできません。ただし、並列化を試みる試みはいくつか存在します。
考えられるアイデアの一つは、PQアクセスをサポートするプロセッサEREW-PRAMマシンでは、[ 2 ]合計実行時間を短縮して。
クルスカルの最小全域木アルゴリズムは、最小全域木のサイクル特性を利用します。以下に、その概要を示す擬似コードを示します。
各頂点がそれぞれ独自のサブツリーを持つ森 foreach重量の昇順 でそして異なるサブツリーでTを返す
サブツリーはunion-findデータ構造に格納されるため、償却されたデータ構造では 2 つの頂点が同じサブツリーにあるかどうかをチェックすることが可能です。どこは逆アッカーマン関数です。したがって、アルゴリズムの総実行時間は です。。 こここれは、単一値の逆アッカーマン関数を表し、現実的な入力値に対しては5未満の整数値が得られます。
プリムのアルゴリズムと同様に、クルスカルのアプローチにも、古典的なバリアントでは並列化できないコンポーネントがあります。たとえば、2つの頂点が同じ部分木にあるかどうかを判断することは、2つの結合操作が同時に同じ部分木を結合しようとする可能性があるため、並列化が困難です。並列化の唯一の機会は、ソートのステップにあります。最適な場合、ソートは線形であるため、プロセッサ数を増やすと、総実行時間を短縮できます。。
別のアプローチとしては、元のアルゴリズムを拡張してより積極的に。このアイデアは Osipov らによって提案されました。[ 3 ] [ 4 ] Filter-Kruskal の基本的な考え方は、クイックソートと同様の方法でエッジを分割し、同じツリーに属する頂点を接続するエッジをフィルタリングして、ソートのコストを削減することです。高レベルの擬似コード表現を以下に示します。
filterKruskal(): もしKruskalThreshold: return kruskal() pivot = chooseRandom() 、パーティション(、ピボット) filterKruskal() フィルター() filterKruskal() 戻る パーティション(、ピボット): foreach: 重量()ピボット: それ以外戻る(、) フィルター(): foreach: find-set(u)の場合find-set(v): 戻る
フィルタ・クラスカル法は並列化に適しています。なぜなら、ソート、パーティショニング、フィルタリングは直感的に簡単に並列化でき、エッジをコア間で単純に分割するだけで済むからです。
ボルフカのアルゴリズムの基本的な考え方は、エッジの収縮です。まず削除することで契約が成立するグラフから各エッジをリダイレクトするにこれらの新しいエッジは、以前のエッジの重みを保持します。MSTの重みだけでなく、それがどのエッジで構成されているかも決定することが目的である場合、エッジが縮約された頂点のペアを特定する必要があります。高レベルの擬似コード表現は次のとおりです。
その間のために最も軽いのために 契約Tを返す
収縮によって、2 つの頂点間に複数のエッジが生じる可能性があります。最も軽いエッジを選択する直感的な方法は、しかし、頂点を共有するすべての縮約を並列に実行すれば、これは可能です。再帰は、頂点が1つだけ残ったときに停止します。つまり、アルゴリズムは最大で反復処理により、合計実行時間は。
このアルゴリズムの並列化の1つ[ 5 ] [ 6 ] [ 7 ]では、多対数時間計算量が得られます。そして定数が存在するとなることによって。 ここグラフの実行時間を表しますエッジ、機械上の頂点プロセッサ。基本的な考え方は次のとおりです。
その間 最も軽い入射エッジを見つける // 各頂点に、対応するサブグラフを割り当てる // 各サブグラフを収縮させる //
MSTは、見つかった最も明るいエッジすべてで構成される。
この並列化では、隣接配列グラフ表現を利用してこれは3つの配列から構成されています。長さ頂点については、長さそれぞれの終点についてエッジと長さエッジの重みについては、次に頂点についてです。各辺のもう一方の端は以下のエントリで見つけることができますそして重量番目のエッジ見つけることができるそれから番目のエッジ頂点の間にあるそしてかつその場合に限りそして。
まず、エッジはそれぞれの間に分配されます。プロセッサ。-番目のプロセッサは、間に格納されたエッジを受け取ります。そしてさらに、各プロセッサはこれらのエッジがどの頂点に属するかを知る必要があります(エッジのエンドポイントの 1 つだけを保存し、これを配列に格納します。この情報は、使用バイナリーサーチまたは線形探索を用いる。実際には、漸近的には劣るものの、後者の方法の方が速い場合もある。
次に、各プロセッサは、自身の各頂点に接続する最も明るいエッジを決定します。
探す(、) のためにもしもし
ここで問題となるのは、一部の頂点が複数のプロセッサによって処理されることです。この問題に対する解決策として考えられるのは、各プロセッサが独自の配列は、後で削減を使用して他の配列と結合されます。各プロセッサは、他のプロセッサによっても処理される頂点を最大 2 つ持ち、各削減はしたがって、このステップの合計実行時間は。
前のステップで収集したエッジのみで構成されるグラフを観察してください。これらのエッジは、最も軽い接続エッジである頂点から離れる方向に向いています。結果として得られるグラフは、複数の弱連結成分に分解されます。このステップの目的は、各頂点にそれが属する成分を割り当てることです。すべての頂点にはちょうど 1 つの出力エッジがあり、したがって各成分は擬似木であることに注意してください。擬似木とは、成分内の最も軽いエッジと平行に、ただし逆方向に走る 1 つの余分なエッジを持つ木です。次のコードは、この余分なエッジをループに変更します。
並列処理もし
弱連結成分はすべて、根にループを持つ有向木となります。この根は、各成分の代表として選択されます。以下のコードは、ダブリングを使用して各頂点に代表を割り当てます。
その間すべての人へ
これで、すべてのサブグラフがスターになりました。高度なテクニックを使用すると、このステップでは時間。
このステップでは、各部分グラフが単一の頂点に縮小されます。
サブグラフの数 全単射関数を見つけるスタールート
全単射関数を見つけることが可能ですプレフィックス和を使用します。新しい頂点とエッジのセットができたので、隣接配列を再構築する必要があります。これは、整数ソートを使用して実行できます。で時間。
各反復処理では、時間、そしてシーケンシャルな場合と同様に、反復処理により、合計実行時間は。 もしアルゴリズムの効率はそしてそれは比較的効率的です。そうすれば、それは非常に効率的だと言えるでしょう。
MST を見つける問題を扱う並列アルゴリズムは他にも複数あります。線形数のプロセッサを使用すれば、これを次のように実現できます。[ 8 ] [ 9 ] BaderとCongは、最適な逐次アルゴリズムよりも8コアで5倍速いMSTアルゴリズムを発表した。[ 10 ]
もう一つの課題は外部メモリモデルです。Dementievらによって提案されたアルゴリズムは、内部メモリのみを使用するアルゴリズムよりも2~5倍遅いだけだとされています[ 11 ]。