クラスタリングの違い HDU - 5486
質問の意味:Nエンティティ、新旧両方のクラスタリングアルゴリズムがあり、各アルゴリズムは、エンティティで同じアルゴリズムで多くのクラスタリングを持つクラスターに属し、その後、3つのモードがあります。
散乱まず、いくつかの新しいクラスタリングアルゴリズムは、古いアルゴリズムクラスタリングのサブセットです。
第二の重合は、いくつかの古いクラスタリングアルゴリズムは、新しいアルゴリズムクラスタのサブセットです。
第1:1、新しいクラスタリングアルゴリズムは、クラスタリングアルゴリズムが古いと同じです。
各モードは何をお願いしていますか?
実際の道路は、明確でシミュレートすることで、各エンティティは、最大で1回横断し、その時間を心配しないでください。
最初のクラスタ番号のハッシュは、各エンティティは、その後、すべての新しいクラスタリングアルゴリズムによって、対応するクラスタに割り当てられ、その後、各エンティティの各クラスタを反復処理するには、古いアルゴリズムは、このエンティティセットで使用することを保存しますクラスタリング。
そして、そこにさまざまな状況で、要素に設定されている場合は、1よりも大きい場合、分散が、我々は古いアルゴリズムで設定されたクラスタを横断して、エンティティを横断し、企業は数が現在の数を横断する新しいアルゴリズムに対応して見ることではないことは明らかです
あなたは要素1に設定することが起こる場合は、新しいアルゴリズムのサイズが現在のトラバースと等しい場合、これは一意に古いクラスタアルゴリズムのサイズに対応を見て、1:1、または他の我々は、重合、ほとんど分散を持つプロセスを考えます
トラバースエンティティその後、新しいアルゴリズムで設定されたクラスタを横断、セットでこの新しいエンティティに対応するアルゴリズムをクラスタリング保存し、古いエンティティにクラスタリングアルゴリズムを横断、エンティティの数は、この古いアルゴリズムに対応するすべてではありません見ます番号
これは、ここで注意しなければならないクラスタの行をスキップに戻って横断し、その後、数を横断する新しいクラスタリングアルゴリズムをマークするものです。
良いSTLは注意することは、達成して具体的な実装では、メモリの問題ということでいいです。明らかに、すべてのメモリが超メモリになりますクリアなので、スワップを使用することはありません
OK上の2次元ベクトル、ベクトル<整数> PP1 [N]、PP2 [N]、次いでこのベクターに、スーパーメモリを開きます<ベクトル<INT >>動的なメモリ割り当てが存在します。
私は主にスワップしてメモリを削減する2次元ベクトル法だけでなく、無秩序マップの一部を保存したいです。オンラインソリューションの言葉やアイデア、与えられたマッピング関係を変換し、ライン上の学位DFS点を決定します。
1つの#include <cstdioを> 2の#include <Tr1の/ unordered_map> 3。の#include <ベクトル> 4。の#include < SET > 5。 使用した 名前空間STD; 6のtypedef ロング ロングLL; 7 のconst int型 N = 1E6 + 2 ; 8 CONST LL M = + 1E10 11。; 。9 Tr1の:: unordered_map <LL、int型 > MMP; 10ベクトル<ベクトル< int型 >>のPP1、PP2; // クラスタに対応するエンティティを記録 。11 SET < int型> TEMP; 12れる BOOL VIS [N]; 13である INT ; MATCH1 [N]、MATCH2、[N]を押し// クラスタに対応するレコードのエンティティ 14 INT メイン(){ 15 INT T = 1 、T、N - 、CNT1、CNT2をID1、ID2、 16 LL C1、C2; 17 scanfの(" %のD "、&T); 18である 一方、(T <= T){ 19。 CNT1 CNT2 = = 0 ; 20である トランジスタTr1 :: unordered_map <LL、整数 > () .swap(MMP); 21である ベクトル<ベクトル< INT >>().swap(PP1)。 22 ベクトル<ベクトル< 整数 >> ().swap(PP2)。 23 pp1.push_back(ベクトル< 整数 > ()); 24 pp2.push_back(ベクトル< 整数 > ()); 25 のscanf(" %d個"、&N) 26 のために(int型 I = 0 ; iが<= N; iが++)VIS [I] = 偽。 27 のために(int型 i = 1 ; iが<= N iが++ ){ 28 のscanf(" %のLLDの%のLLD "、&C1&C2)。 29の C2 + = M。 30 であれば(MMP [C1]!)MMP [C1] = ++ CNT1。 31 であれば(MMP [C2]!)MMP [C2] = ++ CNT2。 32 ID1 = MMP [C1]; ID2 = MMP [C2]。 33 であれば(CNT1> =(INT )pp1.size()) 34 pp1.push_back(ベクトル< 整数 > ()); 35 であれば(CNT2> =(INT )pp2.size()) 36 pp2.push_back(ベクトル< 整数 > ()); 37 PP1 [ID1] .push_back(I)。 38 PP2 [ID2] .push_back(I)。 39 MATCH1 [I] = ID1。 40 MATCH2 [I] = ID2。 41 } 42 INT ANS1 = 0、ANS2 = 0、ANS3 = 0 。 43 のためには、(int型 I = 1 ; I <= CNT1; iは++ ){ 44 であれば(VIS [i])と続けます。 45 セット < 整数 > ().swap(TEMP)。 46 のために(INT J = 0 ; J <(INT)PP1 [I] .size(); J ++) 47 temp.insert(MATCH2 [PP1 [I] [J])。 48 であれば((INT)temp.size()> 1 ){ 49 ブールフラグ= 真。 50 のために(セット < INT > ::イテレータがtemp.beginを()=;!それ= temp.end()&&フラグ;それ++ ){ 51 ID2 = * こと。 52 のための(int型のk = 0 ; K <(INT)PP2 [ID2] .size()&&フラグあり、k ++ ){ 53 ID1 = PP2 [ID2] [K]。 54 もし(!MATCH1 [ID1] = I)フラグ= 偽; 55 } 56 } 57 であれば(フラグ)ANS1 ++ 。 58 } 他{ 59 ID2 = * temp.begin()。 60 であれば((INT)PP2 [ID2] .size()=(!INT )PP1 [I] .size()){ 61 セット < 整数 > ().swap(TEMP)。 62 のための(int型 J = 0 ; J <(INT)PP2 [ID2] .size(); J ++ ){ 63 ID1 =PP2 [ID2] [J]。 64 であれば(MATCH1 [ID1] =!I)temp.insert(MATCH1 [ID1])。 65 } 66 ブールフラグ= 真。 67 のための(設定 < 整数 > ::それはtemp.beginを()=イテレータ;!それ= temp.endを();それ++ ){ 68 ID1 = * それ。 69 VIS [ID1] = 真。 70 のための(int型のk = 0 ; K <(INT)PP1 [ID1] .size(); ++ k個){ 71 INT ID3 = PP1 [ID1] [K]。 72 もし(!MATCH2 [ID3] = ID2){ 73 フラグ= 偽。 74 ブレーク; 75 } 76 } 77 } 78 であれば(フラグ)ANS2 ++ 。 79 } 他 ANS3 ++ ; 80 } 81 } 82 のprintf(" ケース#1%D:%D%D%D \ n "、T ++ 、ANS1、ANS2、ANS3)。 83 } 84 リターン 0; 85 }