【发布时间】:2017-02-09 06:54:18
【问题描述】:
我正在过滤一个 Set,基于同一个 Set 的其他值,更准确地说,过滤掉完全包含在另一个 set 中的集合
Set(Set(1, 2), Set(1, 3), Set(1, 4), Set(1, 2, 3))
这将导致:
Set(Set(1, 4), Set(1, 2, 3))
1,2 和 2,3 完全包含在最后一组中(基本上,我只想要该批次中最大的子集)
我想出了这段代码,它可以解决问题:
def filterIncluded(data: Set[Set[Int]]): Set[Set[Int]] = {
data.filterNot{ s =>
data.exists(x => x.size > s.size && s.forall(x.contains))
}
}
效果很好,除了一个问题:效率极低,我的实际数据集将有数百万个集合,每个集合可以有 2 到 100 个值
有什么方法可以让这个过程更快吗? (使用另一种类型的集合,不同的方法调用,改变它的循环方式等)
【问题讨论】:
-
可能还有其他/更好的解决方案,但有一个想法:如果您可以将外部
Set更改为排序集合(按内部Sets 的大小),您可以只检查Sets 比当前更大。Set也有一个subsetOf()方法,它可能比s.forall(x.contains)更快。 -
@Marth,然后(来自 Scala 库源)
def subsetOf(that: GenSet[A]): Boolean = this forall that:) (x.contains等同于x.apply对于集合,所以这与 OP 的测试相同)。不过,使用subsetOf更能揭示意图
标签: performance scala collections