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

scala – 向量上splitAt函数的性能

发布时间:2020-12-16 18:54:28 所属栏目:安全 来源:网络整理
导读:由于其trie表示,向量上的大多数操作实际上是恒定的.但是,我无法弄清楚splitAt实现的性能配置文件是什么. 它在库中定义为: override /*IterableLike*/ def splitAt(n: Int): (Vector[A],Vector[A]) = (take(n),drop(n)) take函数具有以下定义: override def
由于其trie表示,向量上的大多数操作实际上是恒定的.但是,我无法弄清楚splitAt实现的性能配置文件是什么.

它在库中定义为:

override /*IterableLike*/ def splitAt(n: Int): (Vector[A],Vector[A]) = (take(n),drop(n))

take函数具有以下定义:

override def take(n: Int): Vector[A] = {
    if (n <= 0)
      Vector.empty
    else if (startIndex + n < endIndex)
      dropBack0(startIndex + n)
    else
      this
  }

dropBack0具有以下定义:

private def dropBack0(cutIndex: Int): Vector[A] = {
    val blockIndex = (cutIndex - 1) & ~31
    val xor = startIndex ^ (cutIndex - 1)
    val d = requiredDepth(xor)
    val shift = (startIndex & ~((1 << (5*d))-1))    
    val s = new Vector(startIndex-shift,cutIndex-shift,blockIndex-shift)
    s.initFrom(this)
    s.dirty = dirty
    s.gotoPosWritable(focus,blockIndex,focus ^ blockIndex)
    s.preClean(d)
    s.cleanRightEdge(cutIndex-shift)
    s
  }

正如你所看到的,dropBack0正在做一些非常复杂的手术.

splitAt是否具有有效的恒定性能还是更差?它似乎是有效的.

解决方法

它实际上是不变的.向量是具有分支因子32的树.进出操作在o(log32N * 32)中执行.由于树的高度不能超过5,在最坏的情况下采取,丢弃或更新的操作次数将是5 * 32 = 160.

(编辑:李大同)

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

    推荐文章
      热点阅读