有序地图是否知道如何有效地搜索Scala中的密钥?

时间:2017-08-23 16:27:56

标签: performance scala dictionary lookup

有序地图是否知道如何有效搜索Scala中的密钥? 想象一下,我有一张地图:

val unorderdMap: Map[Int, String] = ...
val orederedMap: Map[Int, String] = unorderedMap.sort

在orderedMap中对键的查找操作是否更快?

unorderedMap.get(i)  //Slower???
orderedMap.get(i)    //Faster???

编译器是否知道如何有效搜索?

编译器是否在每种情况下以不同方式执行查找操作?

*编辑: 我有一个

 case class A(key: Int, value1: String, value2: String, ...)
 val SeqA: Seq[A] = Seq(A(1, "One", "Uno", ...), A(2, "Two", "Duo",...), ..., A(20000,... ,...))

我希望对密钥进行快速查找操作(这是我唯一感兴趣的) 是否更好地制作地图,如:

val mapA = SeqA.map(a => a.key -> a)(collection.breakOut)

或者将它作为一个序列(并且可能对它们进行排序)更好。 如果我把它作为地图我应该订购还是不订购? *元素在附近 20K - 30K元素!

1 个答案:

答案 0 :(得分:2)

排序地图通常(*)比任何语言的哈希地图慢。这是因为与具有O(1)摊销复杂度的哈希映射相比,有序映射具有O(log n)复杂度。

您应该查看相关的Wiki页面,以获得更深入的解释。

(*)这取决于许多因素,例如地图的大小。对于小集合,如果二进制搜索的排序数组适合缓存,则它可能会做得更好。