マツコの知らない「数学」の世界
エンジニアとして知っておきたい計算量O(n)のお話
マツコの知らない「数学」の世界〜 エンジニアとして知っておきたい計算量O(n)のお話 〜Hiromu Tsuruta
View Slide
こんな記事がバズってました
動的計画法によるDVDのディスク分割の改善
何でバズってるの?
アルゴリズムを使って実際に業務改善をしている!
・家族の「写真や動画」をDVDにして注文できる機能がある・「写真や動画」は1枚に収まらないので複数のディスクに分割する⇨ 「月ごとに分けて各ディスクに入れていく」というアルゴリズム【前提】
1月の思い出データベース2月の思い出 3月の思い出 12月の思い出・・・・・12枚【現状】
ディスクの枚数をもっと減らせないのか⇨ ユーザーから問い合わせが寄せられていた【課題】
どうやって減らす?
月ごとではなく最適化して入れる!
1月の思い出データベース2月の思い出 3月の思い出 12月の思い出・・・・・12枚よりは少ない【解決例】
最適化する = データを分割する
ディスクの枚数課題を解決!
ではありません
ただ、分割すれば良いと言うものではない!
なんで?
データ分割の計算量を意識する必要がある
ユーザー サーバー① アルバムの注文④ 注文枚数を表示サーバー/データ② 枚数の計算を実行③ 計算結果を返す〜 注文フロー 〜
計算が遅いとユーザーの画面反映も遅れる
UXの低下・機会損失
ユーザー サーバー① アルバムの注文④ 注文枚数を表示サーバー/データ② 枚数の計算を実行③ 計算結果を返す〜 注文フロー 〜この部分をなんとかしたい!
計算量を抑えました
O(MN²) から O(MN log N) まで減らし最終的に O(NM²) までになりました(1 ≦ N ≦ 10⁵, 1 ≦ M ≦ 50)
ん?
O とは?
ランダウの記号ギリシア文字の O(オミクロン)を用いて表される大文字をビッグオー、小文字をスモールオーと呼んだりもする数学においてはオーダーという呼び方をする計算量を大雑把に評価する(見積もる)際に使用するexampleO(n) :オーダーのエヌO(log n) :オーダーのログエヌ
具体例を見てみよう!
Example.1「世界のナベアツ」
ナベアツは線形探索しているだけ!
線形探索とは?
・検索アルゴリズムの1つ・リストや配列に入ったデータの検索を行う・先頭から順に比較を行い、見つかれば終了する
「世界のナベアツ」パターン- 3の倍数 or 3が付くなら true- それ以外は falseを必ず1回ずつ確認を行っているand40までしか探索しない
「世界のナベアツ」= O(40)
「世界のナベアツ」が 100 まで探索する場合は?
「世界のナベアツ」= O(100)
「世界のナベアツ」が n まで探索する場合は?
「世界のナベアツ」= O(n)
話を戻すと、、結局、計算量は減ってるの?(ここから普通に数学なのでつまらなかったらすいません)
O(MN²) ⇨ O(MN log N) ⇨ O(NM²)先の話では、、計算量を以下の順番で減らしたO(NM²) ≦ O(MN log N) ≦ O(MN²)(1 ≦ N ≦ 10⁵, 1 ≦ M ≦ 50)
全然わからん、、から具体的な数字に落とし込んでみよう!
取りうる最大値を代入する
1 ≦ N ≦ 10⁵1 ≦ M ≦ 50
1 ≦ M ≦ 501 ≦ M ≦ 10 * 51 ≦ M ≦ 10 * 5 ≦ 10 * 10Mの範囲をNに合わせて拡張する上記のことから1 ≦ M ≦ 10²
O(NM²) ≦ O(MN log N) ≦ O(MN²)O(MN²)≦ O(10² * (10⁵)²)≦ O(10² * 10¹⁰)≦ O(10¹²)O(MN log N)≦ O(10² * 10⁵ * log10⁵)≦ O(10⁷ * 10⁵)≦ O(10¹²)O(NM²)≦ O(10⁵ * (10²)²)≦ O(10⁵ * 10⁴)≦ O(10⁹)N = 10⁵, M = 10²
O(NM²) ≦ O(MN log N) ≦ O(MN²)O(10⁹) ≦ O(10¹²) ≦ O(10¹²)10⁹ ≦ 10¹² ≦ 10¹²
確かに計算上は計算量が小さくなっている!
どうやって小さくしているの?というのはバズっていた記事にあるアルゴリズムを読んでください(この資料はあくまでもO(オーダー)について説明に焦点を当てています)
fin