我有一个类似于下面的方法:
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
?
最佳答案
此代码将引发异常,因为您不能多次使用同一个 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();
}
这将以线性时间运行。
关于Java 8 lambda 表达式求值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45433109/