11

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

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

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

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

到目前为止,我发现最好的解决方案是将 a 转换Set为 aVector并使用上面的解决方案。

有没有更有效/直接的解决方案?

4

2 回答 2

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)
于 2012-12-10T17:21:49.760 回答
1

就该算法的复杂性而言 = n (n -1) / 2,因此 O(n^2) 是您可以获得的最好的(顺序)。

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

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

于 2012-12-10T17:49:48.920 回答