Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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