Aub*_*ron 4 java java-8 java-stream
我有一个类似于以下方法:
public double[] foo(double[] doubleArray) {
DoubleStream stream = Arrays.stream(doubleArray);
return stream.map(s -> s / stream.sum()).toArray();
}
Run Code Online (Sandbox Code Playgroud)
这种方法的复杂性是什么?多少次会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();
}
Run Code Online (Sandbox Code Playgroud)
它会工作,但运行时间将是二次(O(n^2)),因为总和将计算n时间.
更好的方法是只计算一次总和:
public double[] foo(double[] doubleArray) {
double sum = Arrays.stream(doubleArray).sum();
return Arrays.stream(doubleArray).map(s -> s / sum).toArray();
}
Run Code Online (Sandbox Code Playgroud)
这将以线性时间运行.
| 归档时间: |
|
| 查看次数: |
202 次 |
| 最近记录: |