C LANGUAGE TECHNOLOGY

【C言語】最小値,平均値,最大値,合計値,標準偏差,中央値の計算

悩んでいる人

C言語で最小値,平均値,最大値,合計値,標準偏差,中央値の計算方法を教えて!

こういった悩みにお答えします.

本記事の信頼性

  • リアルタイムシステムの研究歴12年.
  • 東大教員の時に,英語でOSの授業.
  • 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校コンピュータサイエンス学部2021年の世界大学学術ランキングで20位)で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発
  • プログラミング歴15年以上,習得している言語: C/C++Solidity,Java,Python,Ruby,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
  • 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」GitHubにオープンソースとして公開

こういった私から学べます.

最小値,平均値,最大値,合計値,標準偏差の計算

C言語で最小値,平均値,最大値,合計値,標準偏差を計算する標準ライブラリ関数はないので,自作します.

\(n\)個のデータ\(x_1, x_2, …, x_n\)における最小値(\(x_{\min}\)),平均値(\(x_{\rm avg}\)),最大値(\(x_{\max}\)),合計値(シグマ\(\Sigma_{i=1}^n x_i\))の計算は下式になります.

\begin{eqnarray*} x_{\min} &=& \min(x_1, x_2, ..., x_n) \\ x_{\rm avg} &=& \frac{\Sigma_{i=1}^n x_i}{n} \\ x_{\max} &=& \max(x_1, x_2, ..., x_n) \\ \Sigma_{i=1}^n x_i &=& x_1 + x_2 + ... + x_n \end{eqnarray*}

標準偏差\(s\)は,\(n\)個のデータ\(x_1, x_2, …, x_n\)とその平均\(\overline{x}\)を用いて下式になります.

$$s = \sqrt{\frac{1}{n}\sum_{i = 1}^n {(x_i - \overline{x})^2}}$$

また,分散\(s^2\)は標準偏差の平方根の中身になります.

$$s^2 = \frac{1}{n}\sum_{i = 1}^n {(x_i - \overline{x})^2}$$

ここで,標準偏差を計算する時に平方根を計算する必要がありますが,以下の2通りでコードを紹介します.

  • 平方根を計算する標準ライブラリのsqrt関数を利用
  • 平方根を計算するmysqrt関数を自作

平方根を計算する標準ライブラリのsqrt関数を利用

最小値,平均値,最大値,合計値,標準偏差(平方根を計算する標準ライブラリのsqrt関数を利用)を計算するコードは以下になります.

実行結果は以下になります.

平方根を計算するmysqrt関数を自作

最小値,平均値,最大値,合計値,標準偏差(平方根を計算するmysqrt関数を自作)を計算するコードは以下になります.

mysqrt関数の自作にニュートン法を利用しています.

実行結果は以下になります.

中央値の計算

中央値とは,データを大きい順(または小さい順)に並べた時の中央にある値のことです.

データ数が偶数の場合は,中央の2つの値の平均値を中央値とします.

中央値の計算方法として以下の2種類の方法を紹介していきます.

データをソートした後に中央値の取得

一番思いつきやすい方法は,データをソートした後に中央値の取得する方法です.

標準ライブラリでクイックソートするqsort関数を利用して,データをソートした後に中央値を取得するコードは以下になります.

実行結果は以下になります.

データ数が奇数と偶数の両方の場合で,中央値が正しく計算できていることがわかります.

中央値(k番目に大きい値・小さい値)を探すパーティションベースの汎用選択アルゴリズム

中央値を探すためにデータが格納されている配列をソートすると,\(\mathcal{O}(n \log n)\)の計算量になってしまいます.

そこで,パーティションベースの汎用選択アルゴリズムを利用することで,中央値を\(\mathcal{O}(n)\)の計算量で探すことができます.

※一般的には,パーティションベースの汎用選択アルゴリズムは,k番目に大きい値・小さい値を探すアルゴリズムです.

パーティションベースの汎用選択アルゴリズムで中央値を探すコードは以下になります.

※C言語の配列は0オリジンで始まることに注意して下さい.

実行結果は以下になります.同様です.

partition関数で利用しているswap関数を深掘りしたいあなたはこちらからどうぞ.

C言語 swap
【C言語】swap関数とswapマクロで値を交換

こういった悩みにお答えします. こういった私から学べます. 目次1 swap2 swap関数2.1 int型のswap関数2.2 double型のswap関数3 swapマクロ3.1 データ型を引数で ...

続きを見る

まとめ

C言語で最小値,平均値,最大値,合計値,標準偏差,中央値の計算方法を紹介しました.

最小値,平均値,最大値,合計値はシンプルな計算で求めました.

標準偏差で平方根を計算する場合は,標準ライブラリのsqrt関数と自作したmysqrt関数のコードを紹介しました.

また,中央値はパーティションベースの汎用選択アルゴリズムで探しました.

よく使う方法ですので,きちんと理解しましょう!

C言語を独学で習得することは難しいです.

私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.

友だち追加

独学が難しいあなたは,C言語を学べるおすすめのオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!

-C LANGUAGE, TECHNOLOGY
-, , , , , , , ,