【问题标题】:How to get all pairs of a set efficiently?如何有效地获得所有对的集合?
【发布时间】:2019-03-05 02:10:25
【问题描述】:

给定一个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&lt;Integer&gt; 中的元素没有索引。

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

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

【问题讨论】:

  • 嵌套循环中只需要一个向量/数组。但除此之外,我认为这是最好的解决方案。
  • @Jochen 我认为 List 是首选解决方案
  • 实际上,我会选择一个数组,因为 Set 可以直接生成一个。但是如果你想要一个集合,那么可以,使用一个列表。
  • 感谢大家对 List 和 Array 的提示!我会记住的。如果不付出更大的努力,似乎无法实现不转换的解决方案?
  • 请记住Set的界面不保证顺序。因此“索引”值可能会发生变化,尤其是在 Set 发生突变的情况下。

标签: java set


【解决方案1】:
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)

【讨论】:

  • Op 说他需要对一个集合做同样的事情,他已经知道如何处理一个列表。 #
  • 谢谢。但正如我已经说过的,这个解决方案有效。是否还有另一种不转换(可能更有效)?
  • 你希望它如何更高效,它会是O(n),示例代码也是如此。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    相关资源
    最近更新 更多