在Scala中将数组的每个元素与一个数字相乘的最快方法

Asi*_*sif 1 arrays scala

我有一个大数组,我想将数组的每个元素与给定的数字N相乘。我可以通过以下方式做到这一点

val arr  =  Array.fill(100000)(math.random)
val N    =  5.0 
val newArr  =  arr.map (  _ * N )
Run Code Online (Sandbox Code Playgroud)

所以这将返回我想要的新数组。另一种方式可能是

def demo (arr :Array [Double]  , value : Double  ) : Array[Double] ={
var res : Array[Double] = Array()
if (  arr.length == 1  )
  res =  Array (  arr.head  + value  )
else
  res = demo  (  arr.slice(0, arr.length/2) , value   )   ++   demo  (   arr.slice  (  arr.length / 2  ,  arr.length  )  ,  value  )
res
}
Run Code Online (Sandbox Code Playgroud)

我的情况是我有更大的数组,我必须为数千次迭代执行此操作。我想问一下有没有更快的方法来获得相同的输出?将尾递归会提高速度?或者其他什么技术?

Wil*_*urn 6

想必你的意思是arr.head * value

从大 O 的角度来看,这些都不是“更快”;它们都是 O(N),这是有道理的,因为它就在描述中:您需要将“每个”数字乘以某个常数。

唯一的区别是,在第二种情况下,您需要花费大量时间对数组进行切片和连接。所以第一个可能会更快。尾递归不会帮助你,因为这不是一个递归问题。您需要做的就是在数组中循环一次。

如果数组中有大量数字,则可以使用arr.par.map.