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
kab0718
February 07, 2024
0
9
アルゴリズムと計算量
kab0718
February 07, 2024
Tweet
Share
More Decks by kab0718
See All by kab0718
お嬢様言葉
kab0718
0
15
アイドルとコミュニケーション
kab0718
0
8
ブラウザレンダリングについて(簡易版)
kab0718
0
22
コーディングで意識してること
kab0718
0
29
趣味とぷよぐらみんぐ
kab0718
0
110
SDLアプリコンテスト2019プレゼン資料
kab0718
0
45
近況報告
kab0718
0
1.1k
アイドル×アイドル
kab0718
0
120
ツンデレの女の子
kab0718
0
99
Featured
See All Featured
Writing Fast Ruby
sferik
622
60k
Building Your Own Lightsaber
phodgson
100
5.7k
Bootstrapping a Software Product
garrettdimon
PRO
302
110k
Intergalactic Javascript Robots from Outer Space
tanoku
266
26k
KATA
mclloyd
16
12k
Designing with Data
zakiwarfel
96
4.8k
Visualization
eitanlees
137
14k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
1
120
Building an army of robots
kneath
300
41k
Building Effective Engineering Teams - LeadDev
addyosmani
33
1.9k
Fantastic passwords and where to find them - at NoRuKo
philnash
39
2.5k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
323
20k
Transcript
計算量とアルゴリズム
はじめに 問題を解く手順のことをアルゴリズムと呼ぶ 一般的に一つの問題を解決するアルゴリズムは複数考えられる どうやってアルゴリズムの良し悪しを判断するか そもそも良いアルゴリズムとは?
良いアルゴリズム = 計算量が少ない
計算量とは アルゴリズムを実行するのに必要なリソースを示す指標 • 時間計算量 かかる時間やステップ数がどれくらいか • 空間計算量 消費するメモリがどれくらいか
基本的に計算量は入力に依存する 時間計算量と空間計算量はトレードオフの関係にある
計算量オーダー 計算量を大まかに測れるもの 入力サイズnが大きくなった場合にどうなっていくか 上記をO(n)やO(logn)のように表現する O(n): nに比例した回数の計算ステップを要する O(logn): lognに比例した回数の計算ステップを要する n
logn n^2 10 3 100 20 4 400 100 7 10,000 300 8 90,000 1000 10 1,000,000
計算量の求め方 右記のプログラムの計算量を求める 1. 各行のステップ数を足して全体の ステップ数を算出する ...1+n^2+n^2+1 = 2+2n^2 2.
最大次数以外の項を除く ...2+2n^2 → 2n^2 3. 係数を除く ...2n^2 → n^2 このコードの計算量は O(n^2)
計算量の求め方 Q. なんで最大次数以外の項を除くの? A. nが大きくなると他の項がほぼ無視できるため 例)ステップ数が2n^2+10n+10, n=10000 2n^2+10n+10
= 200100010 2n^2 = 200000000 Q. 係数を除くのはなぜ? A. 計算量の定義上、定数倍程度の違いはさほど重要じゃない O(n^3)とO(10n^2)だと10n^2の方が早いので
有名なアルゴリズム min <= x < max におけるxの値を特定したいときの手法 • 線形探索法: O(n)
minから順に比較していく • 二分探索法: O(logn) 2/max以上かを繰り返し確認していく ソート済のものにしか使えない
ソートアルゴリズム(最悪/平均/最良) • クイックソート: O(n^2)/O(nlogn)/O(nlogn) 基準値を決めてそれより大きい配列と小さい配列に分割 上記を再帰的に繰り返し行う • 選択ソート: O(n^2)/O(n^2)/O(n^2) 最小の要素を見つけ先頭の要素と入れ替え
先頭の要素を除いて最小を見つけ二番目の要素と入れ替え... • バブルソート: O(n^2)/O(n^2)/O(n) 先頭から順に隣接する要素と比較して入れ替え 最後から二番目の要素まで上記繰り返し
最後に • 場面によって最適なアルゴリズムは異なる • 計算量はデータ構造(配列,連結リスト,ツリー...)でも変化する • アルゴリズム調べると色々な問題出てきて面白い • この辺詳しくなりたければ競プロやるのが良さそう