我的方法类似于以下方法:
public double[] foo(double[] doubleArray) {
DoubleStream stream = Arrays.stream(doubleArray);
return stream.map(s -> s / stream.sum()).toArray();
}
这种方法的复杂性是什么? DoubleStream
sum
方法执行多少次?一次或O(n)
次,n = doubleArray.length
?
答案 0 :(得分:7)
此代码将引发异常,因为您不能多次使用相同的Stream。您只能在Stream上执行一个终端操作。
如果您将代码更改为:
public double[] foo(double[] doubleArray) {
return Arrays.stream(doubleArray).map(s -> s / Arrays.stream(doubleArray).sum()).toArray();
}
它会起作用,但运行时间将是二次的(O(n^2)
),因为总和将计算n
次。
更好的方法是只计算一次总和:
public double[] foo(double[] doubleArray) {
double sum = Arrays.stream(doubleArray).sum();
return Arrays.stream(doubleArray).map(s -> s / sum).toArray();
}
这将以线性时间运行。