ベクトル内の値の平均、中央値、およびsdを計算する必要があります。ベクトルを並べ替えて中央値を見つけることはできますが、合計するよりも平均と標準偏差を見つける簡単な方法はありますか?
3 に答える
中央値は。で見つけることができますstd::nth_element
。(明らかに)一般的な信念に反して、これは通常、並べ替えよりも高速で、中間の要素を見つけます-通常はO(N)(線形)であり、並べ替えは通常O(N log N)です。
平均の要素を追加するには、次のstd::accumulate
ようにする必要があります。
double total = std::accumulate(std::begin(v), std::end(v), 0.0);
[注:コンパイラーの古さによっては、 end(v)`の代わりにv.begin()
andを使用する必要がある場合があります)。]v.end()
begin(v) and
分散の計算については、前の質問で説明しました。標準偏差は、単に分散の平方根です。
平均を見つけるには、ベクトルの内容を追加するだけです。最初にベクトルを実際に並べ替えなくても中央値を見つけることができますが、並べ替えられていないベクトルの中央値を計算するアルゴリズムは、並べ替えられている場合よりもはるかに複雑になることはほぼ間違いありません。また、ソートされていないベクトルで中央値を見つける時間を計算すると、ほぼ確実に、中央値をソートして抽出する時間を合わせた時間よりも長くなると確信しています。(技術的な課題のためだけにそれをしているのなら、私はあなたのためにそれを書きます...)
おそらくベクトルを並べ替える必要があるので、並べ替え中に平均を計算できます。
編集:C ++タグが表示されませんでした!
関数型プログラミングツールを提供する言語を使用している場合は、+関数を使用してベクトルを折り畳み、その長さで割って平均を求めることができます。
stddevの場合、ラムダ:x->(x-mean)^ 2を使用して、結果を+で折りたたむことができます。
計算効率はそれほど高くありませんが、開発者の時間を大幅に節約できる可能性があります。