Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
マツコの知らない「数学」の世界
Search
h.crane
December 26, 2019
Technology
0
400
マツコの知らない「数学」の世界
マツコの知らない「数学」の世界
エンジニアとして知っておきたい計算量O(n)のお話
h.crane
December 26, 2019
Tweet
Share
More Decks by h.crane
See All by h.crane
iOSDJ2025 - Stream Deck Plugin using Swift
hcrane
0
1.3k
Getting started with controlling LEGO using Swift
hcrane
2
1.3k
Swift 5.9 と C++ の互換性
hcrane
1
860
Live on iOSDC2023
hcrane
4
1.4k
自販機で1000円を使い切りたいんじゃ!
hcrane
0
180
Vision.framework - 商品画像からのテキスト検出と並列化実装への試み
hcrane
1
830
DevRel/Japan 2023 - 1つの事業部だけで行う DevRel とは
hcrane
0
1.1k
R2-D2をiOSで動かす
hcrane
2
4.3k
iOSDC2022 - SwiftUI in UIKit で開発する世界
hcrane
6
7.6k
Other Decks in Technology
See All in Technology
ガバメントクラウド(AWS)へのデータ移行戦略の立て方【虎の巻】 / 20251011 Mitsutosi Matsuo
shift_evolve
PRO
2
190
20201008_ファインディ_品質意識を育てる役目は人かAIか___2_.pdf
findy_eventslides
2
610
オープンソースでどこまでできる?フォーマル検証チャレンジ
msyksphinz
0
130
能登半島地震で見えた災害対応の課題と組織変革の重要性
ditccsugii
0
660
Vibe Coding Year in Review. From Karpathy to Real-World Agents by Niels Rolland, CEO Paatch
vcoisne
0
130
AWS Control Tower に学ぶ! IAM Identity Center 権限設計の第一歩 / IAM Identity Center with Control Tower
y___u
0
150
そのWAFのブロック、どう活かす? サービスを守るための実践的多層防御と思考法 / WAF blocks defense decision
kaminashi
0
190
Git in Team
kawaguti
PRO
3
360
綺麗なデータマートをつくろう_データ整備を前向きに考える会 / Let's create clean data mart
brainpadpr
3
450
プロポーザルのコツ ~ Kaigi on Rails 2025 初参加で3名の登壇を実現 ~
naro143
1
220
新規事業におけるGORM+SQLx併用アーキテクチャ
hacomono
PRO
0
210
エンタメとAIのための3Dパラレルワールド構築(GPU UNITE 2025 特別講演)
pfn
PRO
0
260
Featured
See All Featured
Build your cross-platform service in a week with App Engine
jlugia
232
18k
Thoughts on Productivity
jonyablonski
70
4.9k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
900
Typedesign – Prime Four
hannesfritz
42
2.8k
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.7k
RailsConf 2023
tenderlove
30
1.2k
Leading Effective Engineering Teams in the AI Era
addyosmani
3
370
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
31
2.7k
Gamification - CAS2011
davidbonilla
81
5.5k
Balancing Empowerment & Direction
lara
4
690
Building an army of robots
kneath
306
46k
Transcript
マツコの知らない「数学」の世界 〜 エンジニアとして知っておきたい計算量O(n)のお話 〜 Hiromu Tsuruta
こんな記事がバズってました
動的計画法によるDVDのディスク分割の改善
何でバズってるの?
アルゴリズムを使って実際に業務改善をしている!
・家族の「写真や動画」をDVDにして注文できる機能がある ・「写真や動画」は1枚に収まらないので複数のディスクに分割する ⇨ 「月ごとに分けて各ディスクに入れていく」というアルゴリズム 【前提】
1月の思い出 データベース 2月の思い出 3月の思い出 12月の思い出 ・・・・・ 12枚 【現状】
ディスクの枚数をもっと減らせないのか ⇨ ユーザーから問い合わせが寄せられていた 【課題】
どうやって減らす?
月ごとではなく最適化して入れる!
1月の思い出 データベース 2月の思い出 3月の思い出 12月の思い出 ・・・・・ 12枚よりは少ない 【解決例】
最適化する = データを分割する
ディスクの枚数課題を解決!
ではありません
ただ、分割すれば良いと言うものではない!
なんで?
データ分割の計算量を意識する必要がある
None
ユーザー サーバー ① アルバムの注文 ④ 注文枚数を表示 サーバー/データ ② 枚数の計算を実行 ③
計算結果を返す 〜 注文フロー 〜
計算が遅いとユーザーの画面反映も遅れる
UXの低下・機会損失
ユーザー サーバー ① アルバムの注文 ④ 注文枚数を表示 サーバー/データ ② 枚数の計算を実行 ③
計算結果を返す 〜 注文フロー 〜 この部分をなんとかしたい!
計算量を抑えました
O(MN²) から O(MN log N) まで減らし 最終的に O(NM²) までになりました (1
≦ N ≦ 10⁵, 1 ≦ M ≦ 50)
ん?
O とは?
ランダウの記号 ギリシア文字の O(オミクロン)を用いて表される 大文字をビッグオー、小文字をスモールオーと呼んだりもする 数学においてはオーダーという呼び方をする 計算量を大雑把に評価する(見積もる)際に使用する example O(n) :オーダーのエヌ O(log
n) :オーダーのログエヌ
具体例を見てみよう!
Example.1 「世界のナベアツ」
None
ナベアツは線形探索しているだけ!
線形探索とは?
・検索アルゴリズムの1つ ・リストや配列に入ったデータの検索を行う ・先頭から順に比較を行い、見つかれば終了する
「世界のナベアツ」パターン - 3の倍数 or 3が付くなら true - それ以外は false を必ず1回ずつ確認を行っている
and 40までしか探索しない
「世界のナベアツ」= 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 ≦ 50 1 ≦ M ≦ 10
* 5 1 ≦ M ≦ 10 * 5 ≦ 10 * 10 Mの範囲を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