【问题标题】:Efficient way to identify named Sets with common elements in Scala在 Scala 中识别具有公共元素的命名集的有效方法
【发布时间】:2013-05-30 22:18:36
【问题描述】:

给定一个 Map[String, Set[String]] 在 Scala 中,确定所有不同键对的集合(其中对应的集合具有非空交集)的集合是一种优雅而有效的方法吗?

例如将地图固定为

  val input = Map (
    "a" -> Set("x", "z"),
    "b" -> Set("f")
    "c" -> Set("f", "z", "44")
    "d" -> Set("99")
  )

那么需要的输出是

  Set(
    ("a", "c"),
    ("b", "c")
  )

在这种情况下,高效意味着比 O(n^2) 更好,其中 n 是作为输入给出的集合族中元素数量的总和。

【问题讨论】:

  • @Calpis 你能详细说明一下你的建议吗?

标签: algorithm scala set-intersection


【解决方案1】:

你无法得到比 O(n^2) 更好的悲观复杂度。看下面的例子:

Map(
  1 -> Set("a"),
  2 -> Set("a"),
  3 -> Set("a"),
  ...
  n -> Set("a")
)

在这种情况下,每一对集合都有非空交集。所以在这种情况下输出的大小是O(n^2),所以你无法得到更好的复杂度。

显然,这并不意味着您想不出比暴力破解更好的算法。例如,您可以这样转换:

val input = Map (
  "a" -> Set("x", "z"),
  "b" -> Set("f")
  "c" -> Set("f", "z", "44")
  "d" -> Set("99")
)

进入这个:

val transformed = Map (
  "x" -> Set("a"),
  "z" -> Set("a", "c"),
  "f" -> Set("b", "c"),
  "44" -> Set("c"),
  "99" -> Set("d")
)

您可以在线性时间内完成此操作。我会为此使用 Scala 集合构建器或可变集合,以避免对不可变集合进行昂贵的操作。

然后,您可以查看转换后的映射中作为值的每个集合,并为每个集合生成其元素的所有可能对。这可能需要 O(n^2),但如果你的输出中没有很多对,那么它会快很多。

【讨论】:

  • 在大多数情况下,预期对的数量将为 O(m),其中 m 是命名集的数量,因此这是一个可接受的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多