2017-08-01 24 views
4

私は、次のような方法があります:のJava 8のラムダ式の評価

public double[] foo(double[] doubleArray) { 
    DoubleStream stream = Arrays.stream(doubleArray); 

    return stream.map(s -> s/stream.sum()).toArray(); 
} 

この方法の複雑さは何? DoubleStreamsumメソッドは何回実行されますか?一度またはO(n)回、n = doubleArray.lengthと?

+3

これはまだ失敗します...ソースからストリームを再作成する必要があります – Eugene

答えて

7

同じストリームを複数回は使用できないため、このコードは例外をスローします。ストリームでは1つのターミナル操作しか実行できません。

あなたにコードを変更した場合:

public double[] foo(double[] doubleArray) { 
    return Arrays.stream(doubleArray).map(s -> s/Arrays.stream(doubleArray).sum()).toArray(); 
} 

それは動作しますが、合計はn回計算されますので、実行している時間は、(O(n^2))二次となります。

より良いアプローチは、一度だけの和を計算するために、次のようになります。

public double[] foo(double[] doubleArray) { 
    double sum = Arrays.stream(doubleArray).sum(); 
    return Arrays.stream(doubleArray).map(s -> s/sum).toArray(); 
} 

これは線形時間で実行されます。

+2

@Eugene言いますか、あるいは私が行ったように 'linear time'を書くことができます。それがnか2nかcnかどうかは関係ありません。すべて線形時間です。 – Eran