微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Scala默认设置实现

我可以从 Scala文档中看到scala.collection.immutable.Set只是一个特征.认情况下使用Set实现中的哪一个? HashSet或TreeSet(或其他)?

我想知道/计划某些功能的运行时间.

例:

scala> val s = Set(1,3,6,2,7,1)
 res0: scala.collection.immutable.Set[Int] = Set(1,3)

> s.find(5),O(1)或O(log(n))的运行时间是多少?
>既然同样适用于Map,那么最好的解决方法是什么?

解决方法

通过查看源代码,您可以发现最多设置四个元素具有EmptySet,Set1,Set2,Set3和Set4提供的优化实现,它们只保存单个值.

例如,这里是Set2声明(从scala 2.11.4开始):

class Set2[A] private[collection] (elem1: A,elem2: A) extends AbstractSet[A] with Set[A] with Serializable

这是包含实现:

def contains(elem: A): Boolean =
  elem == elem1 || elem == elem2

或者找到实现

override def find(f: A => Boolean): Option[A] = {
  if (f(elem1)) Some(elem1)
  else if (f(elem2)) Some(elem2)
  else None
}

非常直截了当.

对于具有4个以上元素的集合,底层实现是HashSet.我们可以在REPL中轻松验证这一点:

scala> Set(1,4).getClass
res1: Class[_ <: scala.collection.immutable.Set[Int]] = class scala.collection.immutable.Set$Set4

scala> Set(1,4,5,6).getClass
res0: Class[_ <: scala.collection.immutable.Set[Int]] = class scala.collection.immutable.HashSet$HashTrieSet

话虽这么说,find必须总是迭代整个HashSet,因为它是未排序的,所以它将是O(n).
相反,像contains这样的查找操作将改为O(1).

Here’s a more in-depth reference一般关于scala集合的性能.

说到地图,几乎相同的概念适用.优化的Map实现最多4个元素,然后它是一个HashMap.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐