我可以从
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 举报,一经查实,本站将立刻删除。