如何有效地获得所有成对的集合?

时间:2012-12-10 17:14:19

标签: java set

给定一个Set的对象,我想要遍历它的所有(无序)对。

示例:Set = {1,2,3},对:(1,2),(1,3),(2,3)。

在处理Vector<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)

Set<Integer>中的元素没有索引。

到目前为止,我找到的最佳解决方案是将Set转换为Vector并使用上述解决方案。

是否有更高效/直接的解决方案?

2 个答案:

答案 0 :(得分:10)

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)

答案 1 :(得分:1)

就该算法的复杂度而言,n (n -1) / 2,因此O(n ^ 2)是你能得到的最好的(顺序)。

虽然,如果你的设置真的很大,那么一套只适合RAM。您可以通过以块方式计算对来优化算法,类似于使用平铺块的矩阵乘法中的方法。这样,您可以减少缓存未命中率,从而提高整体性能。

除此之外,你可以引入并行化并在线程/进程之间划分工作,因为算法似乎是令人尴尬的并行。