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

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

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

在处理Vector ,可以借助每个元素的索引来实现这一点:

 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元素没有索引。

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

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

 List list = new ArrayList(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) 

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

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

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