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.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 客户端几种取WebServices中数据
- 一些常用的WebService
- bash – ssh代理和crontab – 有一个很好的方式让这些见面?
- Scala如何使用扩展与匿名类
- scala – akka stream asyncBoundary vs mapAsync
- angularjs – 如何在节点/ angular / nginx应用程序上强制缓
- scala – 如何在foreachPartition中使用SQLContext和SparkC
- 单元测试 – Angular 2单元测试可观察错误(HTTP)
- 老生常谈Bootstrap媒体对象
- bash – 为什么ssh等待我的subshel??l没有-t,并用-t杀死他们