Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PHPerのための計算量入門 / Basic Knowledge of Time Comple...
Search
Ryo Tomidokoro
March 30, 2019
Technology
4
6k
PHPerのための計算量入門 / Basic Knowledge of Time Complexity
Time Complexity 101 for PHPer
Ryo Tomidokoro
March 30, 2019
Tweet
Share
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
開発者が知っておきたい複雑さの正体/where-the-complexity-comes-from
hanhan1978
7
3k
Spec Driven Development入門/spec_driven_development_for_learners
hanhan1978
2
1.2k
フロントエンドがTypeScriptなら、バックエンドはPHPでもいいじゃない/php-is-not-bad
hanhan1978
8
13k
どうすると生き残れないのか/how-not-to-survive
hanhan1978
17
14k
100分で本番デプロイ!Laravelで作るWebアプリケーション作成/100min_web_app_cicd
hanhan1978
1
220
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
8
3.3k
集中して作業する技術/how_to_work_deeply
hanhan1978
65
53k
PHPでデータベースを作ってみた/create-data-with-php
hanhan1978
11
11k
ADRを一年運用してみた/adr_after_a_year
hanhan1978
8
4.6k
Other Decks in Technology
See All in Technology
AIプラットフォームにおけるMLflowの利用について
lycorptech_jp
PRO
1
160
20251209_WAKECareer_生成AIを活用した設計・開発プロセス
syobochim
7
1.6k
年間40件以上の登壇を続けて見えた「本当の発信力」/ 20251213 Masaki Okuda
shift_evolve
PRO
1
130
Kubernetes Multi-tenancy: Principles and Practices for Large Scale Internal Platforms
hhiroshell
0
120
Sansanが実践する Platform EngineeringとSREの協創
sansantech
PRO
2
880
Lambdaの常識はどう変わる?!re:Invent 2025 before after
iwatatomoya
1
560
「Managed Instances」と「durable functions」で広がるAWS Lambdaのユースケース
lamaglama39
0
320
因果AIへの招待
sshimizu2006
0
980
生成AI活用の型ハンズオン〜顧客課題起点で設計する7つのステップ
yushin_n
0
200
re:Invent2025 3つの Frontier Agents を紹介 / introducing-3-frontier-agents
tomoki10
0
150
ガバメントクラウド利用システムのライフサイクルについて
techniczna
0
190
.NET 10の概要
tomokusaba
0
110
Featured
See All Featured
Leading Effective Engineering Teams in the AI Era
addyosmani
8
1.3k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
196
70k
Designing for humans not robots
tammielis
254
26k
Unsuck your backbone
ammeep
671
58k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.2k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Automating Front-end Workflow
addyosmani
1371
200k
4 Signs Your Business is Dying
shpigford
186
22k
Git: the NoSQL Database
bkeepers
PRO
432
66k
What's in a price? How to price your products and services
michaelherold
246
13k
Optimizing for Happiness
mojombo
379
70k
How to Ace a Technical Interview
jacobian
281
24k
Transcript
PHPerのための計算量入門 Ryo Tomidokoro PHPerKaigi 2019/3/30 @hanhan1978
よくあるコード例から 計算量を理解してみよう
例題 とあるウェブサービスを運営する会社の営業社員が会員 データの分析をするためのCSVファイルを作ります。 全ユーザのデータをDatabaseから取得して、各種付帯情 報を追加してCSVファイルを作成します。
コード例
コードの問題は何? 仕様は満たしている、動作も問題ない。しかし、データ の増大と共に問題を起こす可能性がある。 実際に、サンプルコードの負荷試験をして、データ量と 処理時間の関係を確認する。
データ件数と処理時間の関係
データ件数と処理時間の関係
この問題をどのように検出する? なるべく勘や経験に頼りたくはないが、何か良い方法は あるだろうか?
問題を検出する方法
◎負荷試験 人材や納期、品質向上への理解があるのであれば、本番 相当以上のデータ量を用意した負荷試験を行えば、確実に 検出することが可能 今までのエンジニア人生で、CIに負荷試験が組み込まれ ているのを見たことは稀…
静的解析 PHPStan, PHPMD等、試してみたが流石に計算量の問題点 は検出できない。
▲経験 好きなアプローチではないが、現状もっとも低コストで 現実的に実行できる対策はこれになってしまう。研修や教 育によって計算量に対して、意識を向けてもらうようにす る。
計算量視点を持つ いつものコーディングに、新しい視点として、計算量を 加えて見よう。
計算量とは?
2つの計算量 時間計算量(Time Complexity) プログラムの演算の回数 空間計算量(Space Complexity) プログラムが利用するメモリ使用量
時間計算量の測り方
単純な掛け算関数
単純な掛け算関数
単純な掛け算関数
すべてのアルゴリズムで厳密な時間計算量を 算出するのは大変です。 そこで、時間計算量の世界には便利な記法が あります。
O記法 (Big-O notation) 計算量の目安を表す便利な記法。O記法での表現によっ て、そのアルゴリズムがどんな時間計算量特性を持つのか を理解できる。 O(1), O(n), O(n^2), O(n*log
n) 括弧の中身が計算量のオーダーを表す
データ量と時間計算量特性の関係 [引用] 開発新卒に捧ぐ、基本のアルゴリズムと計算量 https://www.techscore.com/
アルゴリズムと計算量 アルゴリズム 計算量 バブルソート O(n^2) マージソート O(n * log n)
バイナリーサーチ O(log n)
計算量視点で最初の例を読み返す
コード例
コード例
コード例
計算量オーダーを下げる
改善例 ※ $purchased_usersのkeyとvalueを入れ替えておく
改善例
改善例
処理時間を再計測
データ件数と処理時間の関係(改善後)
データ件数と処理時間の関係(改善後)
計算量という視点を持つことで、プログラム が潜在的にもつ問題点を見つけることが出来 た。 ※ただし、データ量が少なければ問題ないこ とが多いので、無闇に計算量ばかり指摘するの はやめましょう。
in_arrayは遅いので、array_key_existsに書き換えて! 悪い指摘の仕方
このプログラムが処理するデータ量が3万件です。アル ゴリズムの計算量がO(N^2)なので、処理時間に懸念があり ます。念の為、負荷試験を追加で行ってもらって良いで しょうか? 良い指摘の仕方
おまけ
配列操作関数の計算量 O(1) O(n) O(n^2) array_key_exists array_key_first array_key_last array_push array_pop array_combine
array_flip array_keys array_map array_rand array_shift array_sum array_unique array_values arsort asort in_array array + array range array_fill array_intersect array_merge
Redisのドキュメント
参考図書 数学ガール4 乱択アルゴリズム (結城 浩) みんなのコンピューターサイエンス (Wladston Ferreira Filho) アルゴリズムとデータ構造 (近藤
嘉雪)
Thanks!! @hanhan1978 https://blog.hanhans.net Ryo Tomidokoro