如何有效地获得所有成对的集合?
给定一个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。 您可以通过以块方式计算对来优化算法,类似于使用图块块进行矩阵乘法的方法。 这样,您可以减少缓存未命中率,从而提高整体性能。
除此之外,您可以引入并行化并在线程/进程之间划分工作,因为算法似乎令人尴尬地并行。