Kruskal の最小スパニング ツリー アルゴリズムを使用して K-Means クラスタリングを実行しようとしています。私の当初の設計では、入力のフルレングスのクラスカル アルゴリズムを実行して MST を生成し、その後、最後の k-1 個のエッジ (または同等に最も高価な k-1 個のエッジ) を削除することでした。
もちろん、これは Kruskal アルゴリズムを実行し、最後の k-1 エッジを追加する直前に停止することと同じです。
2 番目の戦略を使用したいです。つまり、完全な長さの Kruskal アルゴリズムを実行する代わりに、これまでのクラスター数が K に等しくなった直後に停止します。Union-Find データ構造を使用し、この Union-Find データでリスト オブジェクトを使用しています。構造。
このグラフの各頂点は、このリストの現在のクラスターによって表されます。たとえば[1,2,3...]
、頂点 1、2、3 が個別の独立したクラスターにあることを意味します。2 つの頂点が結合されている場合、リスト データ構造の対応するインデックスが更新され、これが反映されます。
たとえば、頂点 2 と 3 をマージすると、リスト データ オブジェクトは次のようになります。[1,2,2,4,5.....]
私の戦略は、2 つのノードがマージされるたびに、リスト内の DISTINCT 要素の数を数え、それが目的のクラスターの数と等しい場合は停止することです。私の心配は、これが最も効率的な選択肢ではないかもしれないということです。リスト内の個別のオブジェクトの数を効率的にカウントする方法はありますか?