我非常喜欢 sschaef 的解决方案,但我想知道是否有人可以衡量该解决方案与此解决方案相比的效率:
scala> val str = "ok:ok:k::"
str: String = ok:ok:k::
scala> str.foldLeft(Map[Char,Int]().withDefaultValue(0))((current, c) => current.updated(c, current(c) + 1))
res29: scala.collection.immutable.Map[Char,Int] = Map(o -> 2, k -> 3, : -> 4)
我认为我的解决方案较慢。如果我们有 n 个总出现次数和 m 个唯一值:
我的解决方案:我们在所有出现或 n 上留下折叠。对于这些事件中的每一个,我们查找一次以找到当前计数,然后再次创建更新后的地图。我假设更新地图的创建是恒定的时间。
总复杂度:n * 2m 或 O(n*m)
sschaef 的解决方案:我们有 groupBy,我假设它只是将条目添加到列表中而不检查地图(因此对于所有值,这将是一个常数时间查找加上附加到列表)所以 n。然后对于 mapValues 它可能会迭代唯一值并获取每个键列表的大小。我假设获取每个条目列表的大小是恒定时间。
总复杂度:O(n + m)
这看起来是正确的还是我的假设有误?