私は、1行に2つの整数値(ソース整数とターゲット整数)を含む単純なファイルを持っています。各行は2つの値の間の関係を表します。ファイルはソートされておらず、実際のファイルには約400万行が含まれています。並べ替え後は、次のようになります。オブジェクトの大きなリストを繰り返しループするときのパフォーマンスを最適化する方法
sourceId;targetId
1;5
2;3
4;7
7;4
8;7
9;5
私の目標は、一意の識別子と、リスト内のすべての独特の関連整数を表します新しいオブジェクトを作成することです。この例の期待される出力は、次の3つのオブジェクトであるべきである。
0, [1, 5, 9]
1, [2, 3]
2, [4, 7, 8]
だからのgroupId 0は、関係の群(1,5および9)を含みます。
以下は、これらのオブジェクトのリストを作成する現在の方法です。 Relationオブジェクトのリストには、メモリ内のすべての行が含まれます。 GroupedRelationのリストは最終結果でなければなりません。
この小さなサンプルプログラムを実行すると、1000 GroupedRelationオブジェクトの作成に15秒かかります。 100万GroupedRelationを作成するには250分かかります。
私は自分のコードを最適化するための助けを求めていますが、私は望む結果を得るには時間がかかります。
期待される結果が同じであるが期待される結果を得るのにかかる時間が大幅に短縮されるように反復を最適化することは可能ですか?これが可能であれば、どうやってそれについてやりますか?
あなたは互いに素セット/組合[ウィキペディア]を参照してください、検索/データ構造/アルゴリズムの検索タイプをマージ(HTTPSを見てすることができます出力します。 //en.wikipedia.org/wiki/Disjoint-set_data_structure)。パス圧縮を使用する実装は(ほぼ)線形の複雑さを備えています。 – halfbit
私は 'O(n)'の1回のパスでID番号のツリーを構築します –