【问题标题】:Efficient way of finding intersection of 5 Sets找到5组交集的有效方法
【发布时间】:2013-04-26 18:04:10
【问题描述】:

我有 5 个具有数值的集合。我有兴趣找到所有 5 个集合的交集。

现在,我正在考虑以下内容

Do a Collections.sort() on all 5 sets

找到最短的集合并做一个

shortestSet.retainAll(otherSet); 

在所有其他集合上。

有没有更有效的方法?

【问题讨论】:

标签: java algorithm sorting set


【解决方案1】:

如果我们知道当您编写 Collections.sort() 时,您正在根据集合的大小对集合列表进行排序,那么您的解决方案对我来说是正确的。基本原理是,如果我们要使用set1.retainAll(set2)(如果集合是HashSets),每个交叉点的运行时间应该与set1 的元素数量大致呈线性关系。所以从最小的开始是有意义的。

【讨论】:

  • 除了在调用retainAll()之前按大小对集合进行排序,如果我们对集合本身进行排序会有所不同吗?
  • @Skynet:不(如果你在谈论对集合的内容进行排序)。
  • @Skynet:没有。此外,套装没有顺序。 (你sort 列出,而不是设置)
【解决方案2】:

您的解决方案很好。不过,在调用 retainAll 方法之前不需要对数字进行排序。

【讨论】:

    【解决方案3】:

    尝试使用

    static <E> Sets.SetView<E> intersection(Set<E> set1, Set<?> set2) 
    

    Google Guava

    【讨论】:

      猜你喜欢
      • 2011-02-02
      • 1970-01-01
      • 2014-12-25
      • 2019-01-02
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多