PHPerのための計算量入門 / Basic Knowledge of Time Complexity
by
Ryo Tomidokoro
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
PHPerのための計算量入門 Ryo Tomidokoro PHPerKaigi 2019/3/30 @hanhan1978
Slide 2
Slide 2 text
よくあるコード例から 計算量を理解してみよう
Slide 3
Slide 3 text
例題 とあるウェブサービスを運営する会社の営業社員が会員 データの分析をするためのCSVファイルを作ります。 全ユーザのデータをDatabaseから取得して、各種付帯情 報を追加してCSVファイルを作成します。
Slide 4
Slide 4 text
コード例
Slide 5
Slide 5 text
コードの問題は何? 仕様は満たしている、動作も問題ない。しかし、データ の増大と共に問題を起こす可能性がある。 実際に、サンプルコードの負荷試験をして、データ量と 処理時間の関係を確認する。
Slide 6
Slide 6 text
データ件数と処理時間の関係
Slide 7
Slide 7 text
データ件数と処理時間の関係
Slide 8
Slide 8 text
この問題をどのように検出する? なるべく勘や経験に頼りたくはないが、何か良い方法は あるだろうか?
Slide 9
Slide 9 text
問題を検出する方法
Slide 10
Slide 10 text
◎負荷試験 人材や納期、品質向上への理解があるのであれば、本番 相当以上のデータ量を用意した負荷試験を行えば、確実に 検出することが可能 今までのエンジニア人生で、CIに負荷試験が組み込まれ ているのを見たことは稀…
Slide 11
Slide 11 text
静的解析 PHPStan, PHPMD等、試してみたが流石に計算量の問題点 は検出できない。
Slide 12
Slide 12 text
▲経験 好きなアプローチではないが、現状もっとも低コストで 現実的に実行できる対策はこれになってしまう。研修や教 育によって計算量に対して、意識を向けてもらうようにす る。
Slide 13
Slide 13 text
計算量視点を持つ いつものコーディングに、新しい視点として、計算量を 加えて見よう。
Slide 14
Slide 14 text
計算量とは?
Slide 15
Slide 15 text
2つの計算量 時間計算量(Time Complexity) プログラムの演算の回数 空間計算量(Space Complexity) プログラムが利用するメモリ使用量
Slide 16
Slide 16 text
時間計算量の測り方
Slide 17
Slide 17 text
単純な掛け算関数
Slide 18
Slide 18 text
単純な掛け算関数
Slide 19
Slide 19 text
単純な掛け算関数
Slide 20
Slide 20 text
すべてのアルゴリズムで厳密な時間計算量を 算出するのは大変です。 そこで、時間計算量の世界には便利な記法が あります。
Slide 21
Slide 21 text
O記法 (Big-O notation) 計算量の目安を表す便利な記法。O記法での表現によっ て、そのアルゴリズムがどんな時間計算量特性を持つのか を理解できる。 O(1), O(n), O(n^2), O(n*log n) 括弧の中身が計算量のオーダーを表す
Slide 22
Slide 22 text
データ量と時間計算量特性の関係 [引用] 開発新卒に捧ぐ、基本のアルゴリズムと計算量 https://www.techscore.com/
Slide 23
Slide 23 text
アルゴリズムと計算量 アルゴリズム 計算量 バブルソート O(n^2) マージソート O(n * log n) バイナリーサーチ O(log n)
Slide 24
Slide 24 text
計算量視点で最初の例を読み返す
Slide 25
Slide 25 text
コード例
Slide 26
Slide 26 text
コード例
Slide 27
Slide 27 text
コード例
Slide 28
Slide 28 text
計算量オーダーを下げる
Slide 29
Slide 29 text
改善例 ※ $purchased_usersのkeyとvalueを入れ替えておく
Slide 30
Slide 30 text
改善例
Slide 31
Slide 31 text
改善例
Slide 32
Slide 32 text
処理時間を再計測
Slide 33
Slide 33 text
データ件数と処理時間の関係(改善後)
Slide 34
Slide 34 text
データ件数と処理時間の関係(改善後)
Slide 35
Slide 35 text
計算量という視点を持つことで、プログラム が潜在的にもつ問題点を見つけることが出来 た。 ※ただし、データ量が少なければ問題ないこ とが多いので、無闇に計算量ばかり指摘するの はやめましょう。
Slide 36
Slide 36 text
in_arrayは遅いので、array_key_existsに書き換えて! 悪い指摘の仕方
Slide 37
Slide 37 text
このプログラムが処理するデータ量が3万件です。アル ゴリズムの計算量がO(N^2)なので、処理時間に懸念があり ます。念の為、負荷試験を追加で行ってもらって良いで しょうか? 良い指摘の仕方
Slide 38
Slide 38 text
おまけ
Slide 39
Slide 39 text
配列操作関数の計算量 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
Slide 40
Slide 40 text
Redisのドキュメント
Slide 41
Slide 41 text
参考図書 数学ガール4 乱択アルゴリズム (結城 浩) みんなのコンピューターサイエンス (Wladston Ferreira Filho) アルゴリズムとデータ構造 (近藤 嘉雪)
Slide 42
Slide 42 text
Thanks!! @hanhan1978 https://blog.hanhans.net Ryo Tomidokoro