加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala默认设置实现

发布时间:2020-12-16 19:21:12 所属栏目:安全 来源:网络整理
导读:我可以从 Scala文档中看到scala.collection.immutable.Set只是一个特征.默认情况下使用Set实现中的哪一个? HashSet或TreeSet(或其他)? 我想知道/计划某些功能的运行时间. 例: scala val s = Set(1,3,6,2,7,1) res0: scala.collection.immutable.Set[Int]
我可以从 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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读