Slide 1

Slide 1 text

マツコの知らない「数学」の世界 〜 エンジニアとして知っておきたい計算量O(n)のお話 〜 Hiromu Tsuruta

Slide 2

Slide 2 text

こんな記事がバズってました

Slide 3

Slide 3 text

動的計画法によるDVDのディスク分割の改善

Slide 4

Slide 4 text

何でバズってるの?

Slide 5

Slide 5 text

アルゴリズムを使って実際に業務改善をしている!

Slide 6

Slide 6 text

・家族の「写真や動画」をDVDにして注文できる機能がある ・「写真や動画」は1枚に収まらないので複数のディスクに分割する ⇨ 「月ごとに分けて各ディスクに入れていく」というアルゴリズム 【前提】

Slide 7

Slide 7 text

1月の思い出 データベース 2月の思い出 3月の思い出 12月の思い出 ・・・・・ 12枚 【現状】

Slide 8

Slide 8 text

ディスクの枚数をもっと減らせないのか ⇨ ユーザーから問い合わせが寄せられていた 【課題】

Slide 9

Slide 9 text

どうやって減らす?

Slide 10

Slide 10 text

月ごとではなく最適化して入れる!

Slide 11

Slide 11 text

1月の思い出 データベース 2月の思い出 3月の思い出 12月の思い出 ・・・・・ 12枚よりは少ない 【解決例】

Slide 12

Slide 12 text

最適化する = データを分割する

Slide 13

Slide 13 text

ディスクの枚数課題を解決!

Slide 14

Slide 14 text

ではありません

Slide 15

Slide 15 text

ただ、分割すれば良いと言うものではない!

Slide 16

Slide 16 text

なんで?

Slide 17

Slide 17 text

データ分割の計算量を意識する必要がある

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

ユーザー サーバー ① アルバムの注文 ④ 注文枚数を表示 サーバー/データ ② 枚数の計算を実行 ③ 計算結果を返す 〜 注文フロー 〜

Slide 20

Slide 20 text

計算が遅いとユーザーの画面反映も遅れる

Slide 21

Slide 21 text

UXの低下・機会損失

Slide 22

Slide 22 text

ユーザー サーバー ① アルバムの注文 ④ 注文枚数を表示 サーバー/データ ② 枚数の計算を実行 ③ 計算結果を返す 〜 注文フロー 〜 この部分をなんとかしたい!

Slide 23

Slide 23 text

計算量を抑えました

Slide 24

Slide 24 text

O(MN²) から O(MN log N) まで減らし 最終的に O(NM²) までになりました (1 ≦ N ≦ 10⁵, 1 ≦ M ≦ 50)

Slide 25

Slide 25 text

ん?

Slide 26

Slide 26 text

O とは?

Slide 27

Slide 27 text

ランダウの記号 ギリシア文字の O(オミクロン)を用いて表される 大文字をビッグオー、小文字をスモールオーと呼んだりもする 数学においてはオーダーという呼び方をする 計算量を大雑把に評価する(見積もる)際に使用する example O(n) :オーダーのエヌ O(log n) :オーダーのログエヌ

Slide 28

Slide 28 text

具体例を見てみよう!

Slide 29

Slide 29 text

Example.1 「世界のナベアツ」

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

ナベアツは線形探索しているだけ!

Slide 32

Slide 32 text

線形探索とは?

Slide 33

Slide 33 text

・検索アルゴリズムの1つ ・リストや配列に入ったデータの検索を行う ・先頭から順に比較を行い、見つかれば終了する

Slide 34

Slide 34 text

「世界のナベアツ」パターン - 3の倍数 or 3が付くなら true - それ以外は false を必ず1回ずつ確認を行っている and 40までしか探索しない

Slide 35

Slide 35 text

「世界のナベアツ」= O(40)

Slide 36

Slide 36 text

「世界のナベアツ」が 100 まで探索する場合は?

Slide 37

Slide 37 text

「世界のナベアツ」= O(100)

Slide 38

Slide 38 text

「世界のナベアツ」が n まで探索する場合は?

Slide 39

Slide 39 text

「世界のナベアツ」= O(n)

Slide 40

Slide 40 text

話を戻すと、、 結局、計算量は減ってるの? (ここから普通に数学なのでつまらなかったらすいません)

Slide 41

Slide 41 text

O(MN²) ⇨ O(MN log N) ⇨ O(NM²) 先の話では、、 計算量を以下の順番で減らした O(NM²) ≦ O(MN log N) ≦ O(MN²) (1 ≦ N ≦ 10⁵, 1 ≦ M ≦ 50)

Slide 42

Slide 42 text

全然わからん、、から 具体的な数字に落とし込んでみよう!

Slide 43

Slide 43 text

取りうる最大値を代入する

Slide 44

Slide 44 text

1 ≦ N ≦ 10⁵ 1 ≦ M ≦ 50

Slide 45

Slide 45 text

1 ≦ M ≦ 50 1 ≦ M ≦ 10 * 5 1 ≦ M ≦ 10 * 5 ≦ 10 * 10 Mの範囲をNに合わせて拡張する 上記のことから 1 ≦ M ≦ 10²

Slide 46

Slide 46 text

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²

Slide 47

Slide 47 text

O(NM²) ≦ O(MN log N) ≦ O(MN²) O(10⁹) ≦ O(10¹²) ≦ O(10¹²) 10⁹ ≦ 10¹² ≦ 10¹²

Slide 48

Slide 48 text

確かに計算上は計算量が小さくなっている!

Slide 49

Slide 49 text

どうやって小さくしているの? というのはバズっていた記事にある アルゴリズムを読んでください (この資料はあくまでもO(オーダー)について説明に焦点を当てています)

Slide 50

Slide 50 text

fin