ボルフカのアルゴリズムは、グラフにおける最小全域木、または連結していないグラフの場合は最小全域森を見つけるための貪欲アルゴリズムである。
これは、1926年にオタカール・ボルーフカによってモラヴィアの効率的な電力ネットワークを構築する方法として初めて発表されました。[ 1 ] [ 2 ] [ 3 ]このアルゴリズムは、1938年にショケによって再 発見され、 [ 4 ] 1951年にはフロレク、 ウカシェヴィチ、ペルカル、シュタインハウス、ズブジツキによって再び発見され、[ 5 ] 1965年にはジョルジュ・ソリンによって再び発見されました。 [ 6 ]このアルゴリズムは、特に並列コンピューティングの文献では、ソリンのアルゴリズムと呼ばれることがよくあります。
このアルゴリズムは、まずグラフの各頂点に接続する最小重みの辺を見つけ、それらの辺すべてをフォレストに追加します。次に、これまでに構築された各木から別の木への最小重みの辺を見つけ、それらの辺すべてをフォレストに追加するという同様のプロセスを繰り返します。このプロセスを繰り返すたびに、グラフの各連結成分内の木の数は、以前の値の半分以下に減少するため、対数的に多くの繰り返しの後、プロセスは終了します。プロセスが終了すると、追加された辺の集合が最小全域フォレストを形成します。
以下の擬似コードは、ボルーフカのアルゴリズムの基本的な実装例を示しています。条件節では、すべてのエッジuvは「なし」よりも安価であるとみなされます。completed変数の目的は、フォレストFがまだ全域フォレストであるかどうかを判断することです。
エッジに異なる重みがない場合は、頂点またはエッジの全順序などに基づく一貫したタイブレーク規則を使用する必要があります。これは、頂点を整数として表現して直接比較したり、メモリ アドレスを比較したりすることで実現できます。タイブレーク規則は、作成されたグラフが実際に森であり、サイクルを含まないことを保証するために必要です。たとえば、ノード { a、b、c } とすべてのエッジの重みが 1 である三角形グラフを考えます。この場合、{ a } の最小重みエッジとしてab、{ b } の最小重みエッジとしてbc、{ c } の最小重みエッジとしてca を選択すると、サイクルが作成される可能性があります。エッジを最初にソース、次に宛先で順序付けるタイブレーク規則を使用すると、サイクルの作成が防止され、最小全域木 { ab、bc } が得られます。
アルゴリズムBorůvkaは、入力:重み付き無向グラフG = ( V , E )です 。 出力: Gの最小全域森Fです。 森F を( V , E ′ ) に初期化します。ここでE ′ = {} です。 completed := false while not completed do Fの連結成分 を見つけ、各頂点にその成分を割り当てる 各コンポーネントの最も安価なエッジを「なし」に初期化します。 Eの各辺uvについて、uとvはFの異なる成分に属する。wx を uの コンポーネントの最安エッジとする。is -preferred-over( uv , wx )の場合、uv をuのコンポーネントの最安エッジとする 。yzをvのコンポーネントの最安エッジとする 。is -preferred-over( uv , yz )の場合、uv をvのコンポーネントの最安エッジと する。すべてのコンポーネントの最安エッジが "None" に設定されている場合、 //これ以上ツリーをマージすることはできない -- 処理が完了した。completed : = trueそれ以外の場合はcompleted := false最安エッジが "None" でない各コンポーネントについて、 その最安エッジをE'に追加する。関数is-preferred-over( edge1 , edge2 )は ( edge2が "None")を返します。 (weight( edge1 ) < weight( edge2 )) または (weight( edge1 ) = weight( edge2 ) かつ tie-breaking-rule( edge1 , edge2 )) function tie-breaking-rule( edge1 , edge2 ) is タイブレークルール。同点の場合にedge1 がedge2 より優先される場合にのみtrueを返します。
最適化として、同じコンポーネント内の2つの頂点を結ぶことが判明した各エッジをGから削除することで、後のコンポーネントで最も安いエッジを探索する時間に影響を与えないようにすることができる。
ボルーヴカのアルゴリズムは、外側のループが終了するまでにO (log V )回繰り返すことが示されており、したがって、実行時間はO ( E log V )となります。ここで、Eはエッジの数、VはGの頂点の数です( E ≥ Vと仮定)。平面グラフ、より一般的にはグラフマイナー操作で閉じられるグラフの族では、アルゴリズムの各段階の後、各コンポーネントのペア間の最も安いエッジ以外のすべてのエッジを削除することで、線形時間で実行できます。[ 7 ]
この問題に対する他のアルゴリズムとしては、プリムのアルゴリズムとクラスカルのアルゴリズムがある。プリムのアルゴリズムとボルーフカのアルゴリズムを組み合わせることで、高速な並列アルゴリズムが得られる。[ 8 ]
カルガー、クライン、タージャンによる、ボルフカのアルゴリズムを部分的にベースとした、より高速なランダム化最小全域木アルゴリズムは、期待値O( E )時間で実行されます。[ 9 ]ベルナール・シャゼル による最もよく知られている(決定論的な)最小全域木アルゴリズムも、ボルフカのアルゴリズムを部分的にベースとしており、O( Eα ( E , V ))時間で実行されます。ここで、αは逆アッカーマン関数です。[ 10 ]これらのランダム化アルゴリズムと決定論的アルゴリズムは、ボルフカのアルゴリズムのステップ(接続されていないコンポーネントの数を減らす)と、コンポーネントのペア間のエッジの数を減らす別のタイプのステップを組み合わせています。