Scala 性能:矢量对阵列缓冲对阵列

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

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 = 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,关于复杂性,你是对的。但是值得测量总时间,因为由于不变性,这里节省了很多时间。这是一篇关于你可能会觉得有用的博客文章。这是一篇关于你可能会觉得有用的博客文章。