Save 37% off PRO during our Black Friday Sale! »

マツコの知らない「数学」の世界

7a0bc9670ff654b04d4361a9afd1bba8?s=47 h.crane
December 26, 2019

 マツコの知らない「数学」の世界

マツコの知らない「数学」の世界

エンジニアとして知っておきたい計算量O(n)のお話

7a0bc9670ff654b04d4361a9afd1bba8?s=128

h.crane

December 26, 2019
Tweet

Transcript

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

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

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

  4. 何でバズってるの?

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

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

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

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

  9. どうやって減らす?

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

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

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

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

  14. ではありません

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

  16. なんで?

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

  18. None
  19. ユーザー サーバー ① アルバムの注文 ④ 注文枚数を表示 サーバー/データ ② 枚数の計算を実行 ③

    計算結果を返す 〜 注文フロー 〜
  20. 計算が遅いとユーザーの画面反映も遅れる

  21. UXの低下・機会損失

  22. ユーザー サーバー ① アルバムの注文 ④ 注文枚数を表示 サーバー/データ ② 枚数の計算を実行 ③

    計算結果を返す 〜 注文フロー 〜 この部分をなんとかしたい!
  23. 計算量を抑えました

  24. O(MN²) から O(MN log N) まで減らし 最終的に O(NM²) までになりました (1

    ≦ N ≦ 10⁵, 1 ≦ M ≦ 50)
  25. ん?

  26. O とは?

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

    n) :オーダーのログエヌ
  28. 具体例を見てみよう!

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

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

  32. 線形探索とは?

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

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

    and 40までしか探索しない
  35. 「世界のナベアツ」= O(40)

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

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

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

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

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

  41. O(MN²) ⇨ O(MN log N) ⇨ O(NM²) 先の話では、、 計算量を以下の順番で減らした O(NM²)

    ≦ O(MN log N) ≦ O(MN²) (1 ≦ N ≦ 10⁵, 1 ≦ M ≦ 50)
  42. 全然わからん、、から 具体的な数字に落とし込んでみよう!

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

  44. 1 ≦ N ≦ 10⁵ 1 ≦ M ≦ 50

  45. 1 ≦ M ≦ 50 1 ≦ M ≦ 10

    * 5 1 ≦ M ≦ 10 * 5 ≦ 10 * 10 Mの範囲をNに合わせて拡張する 上記のことから 1 ≦ M ≦ 10²
  46. 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²
  47. O(NM²) ≦ O(MN log N) ≦ O(MN²) O(10⁹) ≦ O(10¹²)

    ≦ O(10¹²) 10⁹ ≦ 10¹² ≦ 10¹²
  48. 確かに計算上は計算量が小さくなっている!

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

  50. fin