gpt4 book ai didi

scala - map 合并功能的改进

转载 作者:行者123 更新时间:2023-12-01 01:26:19 65 4
gpt4 key购买 nike

我正在编写一个函数来将两个 Map 合并在一起。这是我到目前为止:

def merge[K, V1, V2, V3](left: Map[K, V1], right: Map[K, V2])
(fn: (Option[V1], Option[V2]) => V3): Map[K, V3] = {
val r = (left.keySet ++ right.keySet) map {
key =>
(key -> fn(left.get(key), right.get(key)))
}
r.toMap
}

该功能本身有效。您可以这样使用该函数:
val m1 = Map(1 -> "one", 3 -> "three", 5 -> "five")
val m2 = Map(1 -> "I", 5 -> "V", 10 -> "X")
merge(m1, m2) { (_, _) }
// returns:
// Map(1 -> (Some(one),Some(I)),
// 3 -> (Some(three),None),
// 5 -> (Some(five),Some(V)),
// 10 -> (None,Some(X)))

我有两个问题:
  • 我担心 .get 的性能计算复杂度和 .toMap调用。任何人都可以改进实现吗?
  • 我想要默认函数来生成一对值( { (_, _) } )。我不太明白正确执行此操作的语法。

  • 编辑:
    虽然我最初说的是性能,但我的意思是计算复杂度。我的猜测是这个函数在 O(n•ln(n)) 时间内执行。看起来我的函数大致在 O(n) 中执行。可以在 O(ln(n)) 中完成吗?

    最佳答案

    对于默认函数文字使用:

    (fn: (Option[V1], Option[V2]) => V3 = 
    (x: Option[V1], y: Option[V2]) => Tuple2(x,y))

    您必须像这样使用合并: merge(m1,m2)()
    我会说在对实际数据进行一些测量之前不要担心性能。

    编辑:关于性能,通过提供 View 而不是构建 map ,您可以以查找为代价快速“构建” - 假设我们正在处理不可变的 map 。因此,根据实际数据和用例,您可以获得某些操作的更好性能,但它有一个权衡。
    class MergedView[K, V1, V2, V3](
    left: Map[K, V1], right: Map[K, V2]
    )(fn: (Option[V1], Option[V2]) => V3 = (x: Option[V1], y: Option[V2]) => Tuple2(x,y)
    ) extends collection.DefaultMap[K, V3] {
    def get(key: K): Option[V3] = (left.get(key), right.get(key)) match {
    case (None, None) => None
    case t => Some(fn(t._1, t._2))
    }
    lazy val tuples = (left.keys ++ right.keys).map(key => key -> get(key).get)
    def iterator: Iterator[(K, V3)] = tuples.iterator
    }

    val r1 = new MergedView(m1, m2)() // use parens here for second param list.

    关于scala - map 合并功能的改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7507309/

    65 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com