Scala 性能:矢量对阵列缓冲对阵列
Scala 2.11.4- 在尝试解决此问题时,我编写了以下代码:Scala 性能:矢量对阵列缓冲对阵列,scala,performance,vector,arraybuffer,Scala,Performance,Vector,Arraybuffer,Scala 2.11.4- 在尝试解决此问题时,我编写了以下代码: def slidingMaximum(A: Array[Int], B: Int): Array[Int] = { var ans = Vector[Int]() var vectorQ = Vector[Int]() for (i <- 0 to A.length-1) { if (vectorQ.isEmpty) { vectorQ = ve
def slidingMaximum(A: Array[Int], B: Int): Array[Int] = {
var ans = Vector[Int]()
var vectorQ = Vector[Int]()
for (i <- 0 to A.length-1) {
if (vectorQ.isEmpty) {
vectorQ = vectorQ :+ i
}else{
while (!vectorQ.isEmpty && A(vectorQ.last) <= A(i))
vectorQ = vectorQ.dropRight(1)
while (!vectorQ.isEmpty && (vectorQ.head <= i-B))
vectorQ = vectorQ.drop(1)
vectorQ = vectorQ :+ i
}
if (i+1 >= B) ans = ans :+ A(vectorQ.head);
}
return ans.toArray;
}
因为,我是Scala语言的初学者,所以我使用它来使用Vector作为Deque。当我尝试用Array或ArrayBuffer替换Vector类型时,测试用例由于时间复杂性差而失败。当var ans=ArrayBuffer[Int]或var ans=Array[Int]主要涉及使用:+的追加操作时,为什么我们不能使用var ans=ArrayBuffer[Int]或var ans=Array[Int]
是什么让Vector真正脱颖而出?你可以找到以下帖子:它回答了标题中所述的问题 话虽如此,您可以在Scala中非常轻松地实现这个问题。假设我们有以下向量:
val v = Vector(1, 3, -1, -3, 5, 3, 6, 7)
以下内容将提供您想要的、性能良好的内容:
v.sliding(3).map(_.max)
代码运行于。您可以找到以下帖子:它按照标题中的描述回答了您的问题 话虽如此,您可以在Scala中非常轻松地实现这个问题。假设我们有以下向量:
val v = Vector(1, 3, -1, -3, 5, 3, 6, 7)
以下内容将提供您想要的、性能良好的内容:
v.sliding(3).map(_.max)
代码运行于。如果没有火焰图显示所有时间都花在了哪里,很难确定,但我会怀疑以下几点: 您不是在对副本进行变异,而是将修改后的副本分配给var immutable Vector使用结构共享来限制单个更改的成本 复制数组或ArrayBuffer需要复制整个数组-如果您只是在适当的位置对数组进行了变异,那么性能会更好 因此,我预计业绩将是: 最适合于在ArrayList或其他可变向量实现中潜在地包装数组 更糟,但由于结构共享,不可变向量仍然可以接受 每次更改时复制整个阵列/ArrayBuffer最差
如果没有火焰图显示所有时间都花在了哪里,很难确定,但我会怀疑以下几点: 您不是在对副本进行变异,而是将修改后的副本分配给var immutable Vector使用结构共享来限制单个更改的成本 复制数组或ArrayBuffer需要复制整个数组-如果您只是在适当的位置对数组进行了变异,那么性能会更好 因此,我预计业绩将是: 最适合于在ArrayList或其他可变向量实现中潜在地包装数组 更糟,但由于结构共享,不可变向量仍然可以接受 每次更改时复制整个阵列/ArrayBuffer最差
谢谢这是如此的简短和优雅,但我不能确定它的运行时复杂性,因为我的代码中有一些优化。对我来说,它是开着的。你的代码可能在*B上,其中B是滑动窗口的长度吗?@SauravSahu,关于复杂性,你是对的。但是它值得测量总时间,因为由于不变性,这里节省了很多时间。谢谢。这是如此的简短和优雅,但我不能确定它的运行时复杂性,因为我的代码中有一些优化。对我来说,它是开着的。你的代码可能在*B上,其中B是滑动窗口的长度吗?@SauravSahu,关于复杂性,你是对的。但是值得测量总时间,因为由于不变性,这里节省了很多时间。这是一篇关于你可能会觉得有用的博客文章。这是一篇关于你可能会觉得有用的博客文章。