给定一个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
并使用上述解决方案。
是否有更高效/直接的解决方案?
答案 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。您可以通过以块方式计算对来优化算法,类似于使用平铺块的矩阵乘法中的方法。这样,您可以减少缓存未命中率,从而提高整体性能。
除此之外,你可以引入并行化并在线程/进程之间划分工作,因为算法似乎是令人尴尬的并行。