2012-12-10 13 views
8

Setのオブジェクトがあれば、私はすべての(順序のない)ペアを歩きたい。セットのすべてのペアを効率的に取得する方法は?

例:セット= {1,2,3}、ペア:(1,2)、(1,3)、(2,3)。

Vector<Integer>を扱う場合、1は、各要素のインデックスの助けを借りてこれを達成することができますSet<Integer>

for (int i = 0; i < vector.size(); i++) 
    for (int j = i + 1; j < vector.size(); j++) 
    // Do something with vector.get(i) and vector.get(j) 

しかし要素にはインデックスを持っていません。

私が今までに見つけた最良の解決策は、SetVectorに変換し、上記のソリューションを使用することです。

効率的な/直接的なソリューションはありますか? = n (n -1)/2このアルゴリズムの複雑さの点で

+0

ネストされたループでは、ベクトル/配列のみが必要です。しかしそれ以外に、私はこれが最善の解決策だと思う。 – Jochen

+4

ベクトル?なぜリストではないのですか? –

+0

@Jochen私はListが好む解決法だと思う。 –

答えて

9
List<Integer> list = new ArrayList<Integer>(mySet); 
for (int i = 0; i < list .size(); i++) 
    for (int j = i + 1; j < list .size(); j++) 
     // Do something with vector.get(i) and vector.get(j) 
+2

彼はセットで同じことをする必要がある、彼はすでにリストでやる方法を知っている。 # – PermGenError

+0

ありがとうございます。しかし、私がすでに言ったように、この解決策は機能します。変換のない別のものがありますか? –

+0

どのように効率が良くなると思いますか、それは 'O(n)'であり、サンプルコードもそうです。 –

1

、これはO(n^2)は、(シーケンシャル)得ることができる最高です。

あなたのセットが本当に大きければ、RAMにしか収まらないセットです。タイルブロックを使用した行列乗算で行われているのと同様の方法でペアを計算することによって、アルゴリズムを最適化することができます。この方法で、キャッシュミスの割合を減らすことができ、全体的なパフォーマンスが向上します。

さらに、スレッド/プロセス間で並列化と分割の作業を導入することもできます。これは、アルゴリズムが恥ずかしく並行しているように見えるためです。

+0

'タイルブロックを使った行列乗算で行われているのと似たブロック方式でペアを計算する 'について詳しく説明できます –

+0

コメントで説明するのは難しいですが、gnu: http:// www。 umiacs.umd.edu/~ramani/cmsc828e_gpusci/Lecture5.pdfしかし、CPUの使い方にも非常に似ています。 https://en.wikipedia.org/wiki/Loop_tiling – dreamcrash

関連する問題