計算量

Ken Ogura
計算量の話
計算量とは
●
ある問題の答えを出すためにどれくらい計算
を行うか
●
O(計算量)という表記をする
– O(100,000), O(N), O(log N)
– O(2^N), O(1), O(Nα(N))
例
●
問:1 ~ Nまでの整数の総和を求めよ
– 普通に計算する → N-1回足し算 → O(N-1)
– 公式を使う → 足し算と掛け算と割り算 → O(3)
●
計算の仕方によって計算量が違うことがある
いくつかのルール
●
O記法の中身は一番大きな規模だけ残す
●
係数は1にする
●
例
– O(N-1) → O(N)
– O(4N^2 + 2N) → O(N^2)
– O(N^2 + M^2) → NとMが独立なのでこれ以上無理
– O(2^N + N^2) → O(2^N)
– O(3) → O(1)
なぜか
●
中の変数が非常に大きな値になった時のことを考える
●
O(5N^2 + 100N + 4)の場合
– N = 1 → 109
– N = 100→ 60004
– N = 10000 → 501000004
– N = 100000000 → 50000010000000004
●
ほとんどO(5N^2)と変わらなくなる
●
O(N^2)との相対誤差は常にたったの5だから無視できる
演習:素数判定
ある整数Nが素数か判定するアルゴリズムを考えてそれ
の計算量を答えよ
– 高速じゃなくてもOKです
– ちなみに論理的に最速なのはO((log N)^7.5)くらいの
やつです
●
AKS素数判定法って言います
●
おもいつくわけがない
予想される解答
●
N未満の自然数全てについて割れるかどうか試す
– O(N)
– おそい
●
√N未満の自然数全てについて割れるかどうか試す
– O(√N)
– これが思いつけば十分
そんなのありかよ
●
素数表をあらかじめ用意しておく
– O(1)
– 柔軟な発想である
●
しかし欠点がある
– 素数表は非常に大きくなる
– 少なくとも予想されるNより小さい整数について知っ
て居る必要がある
– ようは覚えるためにメモリをめっちゃ食う
空間計算量
●
さきほどのアルゴリズムの時間計算量はO(1)である
●
しかし空間計算量がO(N)である
– 空間計算量というのは、アルゴリズムに使用する記憶
領域に大きさ
– O記法のルールは時間計算量と同じ
– これが大きすぎるとメモリが足りずプログラム動かな
い
まとめ
●
どれくらい計算に時間かかるか
– 時間計算量
●
どれくらい計算にメモリを食うか
– 空間計算量
●
これらを考えると、そのアルゴリズムが問題を解くのに
適しているかどうか決める目安になる
AOJとか
●
競プロの問題にはこのように時間制限とメモリ制限があ
る
●
これを守るような計算量のアルゴリズムを考えれば良い
計算量の目安
●
だいたい1秒がO(10^7)〜O(10^8)くらい
●
メモリはO(10^7)が限界くらい
– 気にする必要がある問題はあまりない
– 1MBでintが250000個という目安
計算量は一つの糸口
●
問題の変数の制約からアルゴリズムの計算量の見当がつ
く
– ↑だいたいO(NlogN)かなー
変数が複数ある場合
●
変数の値が大きいほど計算量も大きくなる
– できるだけ小さい変数の値を使うアルゴリズムを作れ
ばいい
●
↑これはRを中心にアルゴリズムを考えたい
制限からの計算量予想
●
N 10^6 → O(N)≦ もしくは O(N log N)
●
N 10^5 → O(N log N)≦ もしくは O(N log^2 N)
● N 3000 → O(N ^ 2)≦
●
N 500 → O(N ^ 3)≦ の中でも早いもの
● N 100 → O(N ^ 3)≦
●
N 50 → O(N ^ 5)≦ くらいまでいける
●
N 20 → O(2 ^ N)≦ もしくは O(N * 2 ^ N)
アルゴリズムのご紹介
アルゴリズムの紹介
●
あらゆる計算量のアルゴリズムを紹介します
●
基本から応用までいろいろあって全部理解するのは難し
いでしょう
●
もし知らないアルゴリズムがあったら暇なときにググる
といいでしょう
O(N)
●
貪欲法
– ただひたすらにminとかmaxとか条件に合うものを選
ぶアルゴリズム
●
しゃくとり法
– 左端と右端を決めてちょっとずつ右に動きながら適切
な範囲を決めるアルゴリズム
●
木構造関係の前処理
– 深さ、部分木のサイズ、重心、DFS、BFS
O(N)
●
累積和の前処理、いもす法の後処理
– ともに連続した区間の総和を扱うことで、連続した区
間に対するクエリを高速(だいたい定数)で処理する
もの。総和をとったりする前処理や後処理がO(N)
●
エラトステネスのふるい
– 素数表を作る
– メビウス関数表も同時に作れる
O(N)
●
1~Nまでの数字の逆元の取得
– inv[x] = -inv[MOD % x] * (MOD / x);
– という漸化式を使う方法
– 組み合わせ関係の式の前処理において多用
●
aho corasick法による文字列探索
– 探索対象文字列から文字列群の各要素を検出するアル
ゴリズム
O(N)
●
グラフの閉路判定
– 無向グラフの木状判定、有向グラフのDAG判定
– DFSするだけ
●
グラフの強連結成分分解
– 強連結成分とはその中でどの頂点対間にも両方向にパ
スがある誘導グラフ
– 強連結成分を圧縮するとDAGになる
O(N)
●
DAGのトポロジカルソート
– 辺が全て小さい番号から大きい番号に伸びているよう
に頂点を番号付けする
– O(辺の数)です
●
DAGに変換した後にDP
– あらゆるDPはDAGの問題に変換可能です
– 変換後の辺の数をNとするとそのDPはO(N)で溶ける
可能性が高いです
O(N^2)
●
全頂点対の走査
– グラフを作る段階に行う、あらゆるアルゴリズム
– 平面上の全頂点間の辺の列挙等
●
ベルマンフォード法
– 単一始点最短経路を求めるアルゴリズム
– 負の閉路があっても大丈夫
– 特殊な線形計画問題の双対である(牛ゲー)
O(N^3)
●
ワーシャルフロイド法
– 全点対間最短経路を求める方法
– 実装が非常に楽 しかも定数が軽い
●
二部グラフの最大マッチング
– 安定結婚問題みたいな奴
– 詳しくはマッチングでぐぐれ
– O(V(V+E))だったりする
O(√N)
●
素数判定
– 実はもっと高速で有用な乱択アルゴリズムがある
●
約数列挙
– あまりつかわないかも
O(log N)
●
二分探索
– 答えが探索範囲の中点についてどちら側にあるか調べ
る方法を繰り返す探索方法
●
ユークリッドの互除法
– 最大公約数をもとめたり、逆元を求めたりできる
●
繰り返し2乗法
– X^NをO(log N)でもとめる
– 行列に使えば、漸化式を高速に解いたりできる
O(log N)
●
std:set, std:map, std:priority_queueのクエリ
– C++のライブラリから得られる便利なデータ構造
– 順序付き集合、辞書、順序付きキュー
●
平衡二分探索木のクエリ
– 探索、質問、更新、追加、削除、併合、分割
– 右に行くほど実装が重い
O(NlogN)
●
ダイクストラ法
– 本当はO((辺の数 + 頂点の数) log 頂点の数)
– 単一始点最短経路のアルゴリズム
– 負閉路があると動かない
●
エンベロープによる走査
– 複数の一次式に対して、最小値や最大値をなぞる方法
– グラフの下端や上端をなぞる感じ
O(NlogN)
●
ソート
– データを順序付きに並び替えること
– 超頻出アルゴリズム
●
ダイクストラ法
– 本当はO((辺の数 + 頂点の数) log 頂点の数)
– 単一始点最短経路のアルゴリズム
– 負閉路があると動かない
O(NlogN)
●
N^2のアルゴリズムの分割統治
– 分割統治というのは、サイズNのデータをいくつかに
分割して、それぞれについて同様の問題として計算し
た後に、分割された結果を統合するもの
●
バブルソートの交換回数
●
マージソートの実装
●
最近点対探索
– 等につかわれます
O(NlogN)
●
ダブリングの初期化
– ランダムアクセスできない順序付きのものにたいして
log(N)でアクセスするためのデータ構造
– 各ノードにたいして2^x個次を持つ
●
エンベロープによる走査
– 複数の一次式に対して、最小値や最大値をなぞる方法
– グラフの下端や上端をなぞる感じ
O(Nα(N))
● UnionFind
– ばらばらの集合を統合する処理を高速にするアルゴリ
ズム
●
※αはアッカーマン関数の逆関数
– 詳しくは知る必要は全くない
– とりあえずすごく小さい値とだけ覚えておいて
1 of 32

Recommended

勉強か?趣味か?人生か?―プログラミングコンテストとは by
勉強か?趣味か?人生か?―プログラミングコンテストとは勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとはTakuya Akiba
71.8K views69 slides
指数時間アルゴリズム入門 by
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門Yoichi Iwata
44.7K views98 slides
ウェーブレット木の世界 by
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界Preferred Networks
55.4K views67 slides
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~ by
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~Takuya Akiba
57.7K views51 slides
双対性 by
双対性双対性
双対性Yoichi Iwata
25.8K views89 slides

More Related Content

What's hot

Union find(素集合データ構造) by
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)AtCoder Inc.
168.8K views18 slides
最適輸送の解き方 by
最適輸送の解き方最適輸送の解き方
最適輸送の解き方joisino
21.6K views270 slides
明日使えないすごいビット演算 by
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算京大 マイコンクラブ
63.4K views60 slides
プログラムを高速化する話 by
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話京大 マイコンクラブ
242.3K views120 slides
平面グラフと交通ネットワークのアルゴリズム by
平面グラフと交通ネットワークのアルゴリズム平面グラフと交通ネットワークのアルゴリズム
平面グラフと交通ネットワークのアルゴリズムTakuya Akiba
26.2K views54 slides
Rolling Hashを殺す話 by
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話Nagisa Eto
4.1K views26 slides

What's hot(20)

Union find(素集合データ構造) by AtCoder Inc.
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)
AtCoder Inc.168.8K views
最適輸送の解き方 by joisino
最適輸送の解き方最適輸送の解き方
最適輸送の解き方
joisino21.6K views
平面グラフと交通ネットワークのアルゴリズム by Takuya Akiba
平面グラフと交通ネットワークのアルゴリズム平面グラフと交通ネットワークのアルゴリズム
平面グラフと交通ネットワークのアルゴリズム
Takuya Akiba26.2K views
Rolling Hashを殺す話 by Nagisa Eto
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話
Nagisa Eto4.1K views
ユークリッド最小全域木 by 理玖 川崎
ユークリッド最小全域木ユークリッド最小全域木
ユークリッド最小全域木
理玖 川崎4.7K views
機械学習による統計的実験計画(ベイズ最適化を中心に) by Kota Matsui
機械学習による統計的実験計画(ベイズ最適化を中心に)機械学習による統計的実験計画(ベイズ最適化を中心に)
機械学習による統計的実験計画(ベイズ最適化を中心に)
Kota Matsui13.1K views
最適化超入門 by Takami Sato
最適化超入門最適化超入門
最適化超入門
Takami Sato174.7K views
強化学習その1 by nishio
強化学習その1強化学習その1
強化学習その1
nishio21.8K views
プログラミングコンテストでのデータ構造 2 ~動的木編~ by Takuya Akiba
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
Takuya Akiba46K views
プログラミングコンテストでのデータ構造 by Takuya Akiba
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
Takuya Akiba104.8K views
先端技術とメディア表現1 #FTMA15 by Yoichi Ochiai
先端技術とメディア表現1 #FTMA15先端技術とメディア表現1 #FTMA15
先端技術とメディア表現1 #FTMA15
Yoichi Ochiai893K views
ブラックボックス最適化とその応用 by gree_tech
ブラックボックス最適化とその応用ブラックボックス最適化とその応用
ブラックボックス最適化とその応用
gree_tech6K views
指数時間アルゴリズムの最先端 by Yoichi Iwata
指数時間アルゴリズムの最先端指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端
Yoichi Iwata10.3K views
Chokudai search by AtCoder Inc.
Chokudai searchChokudai search
Chokudai search
AtCoder Inc.14.1K views

Viewers also liked

色々なダイクストラ高速化 by
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化yosupo
25K views35 slides
計算量とオーダー by
計算量とオーダー計算量とオーダー
計算量とオーダー京大 マイコンクラブ
10.8K views8 slides
アルゴリズムのお勉強 ダイクストラ by
アルゴリズムのお勉強 ダイクストラアルゴリズムのお勉強 ダイクストラ
アルゴリズムのお勉強 ダイクストラhixi365
967 views105 slides
ソーティングと貪欲法 by
ソーティングと貪欲法ソーティングと貪欲法
ソーティングと貪欲法京大 マイコンクラブ
7.7K views13 slides
Deque with Haskel by
Deque with HaskelDeque with Haskel
Deque with HaskelKen Ogura
1.9K views93 slides
Amortize analysis of Deque with 2 Stack by
Amortize analysis of Deque with 2 StackAmortize analysis of Deque with 2 Stack
Amortize analysis of Deque with 2 StackKen Ogura
4.7K views77 slides

Viewers also liked(8)

色々なダイクストラ高速化 by yosupo
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化
yosupo25K views
アルゴリズムのお勉強 ダイクストラ by hixi365
アルゴリズムのお勉強 ダイクストラアルゴリズムのお勉強 ダイクストラ
アルゴリズムのお勉強 ダイクストラ
hixi365967 views
Deque with Haskel by Ken Ogura
Deque with HaskelDeque with Haskel
Deque with Haskel
Ken Ogura1.9K views
Amortize analysis of Deque with 2 Stack by Ken Ogura
Amortize analysis of Deque with 2 StackAmortize analysis of Deque with 2 Stack
Amortize analysis of Deque with 2 Stack
Ken Ogura4.7K views
AtCoder Beginner Contest 004 解説 by AtCoder Inc.
AtCoder Beginner Contest 004 解説AtCoder Beginner Contest 004 解説
AtCoder Beginner Contest 004 解説
AtCoder Inc.17.4K views
最小カットを使って「燃やす埋める問題」を解く by shindannin
最小カットを使って「燃やす埋める問題」を解く最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
shindannin31.9K views

More from Ken Ogura

Trianguler by
TriangulerTrianguler
TriangulerKen Ogura
3K views71 slides
Npc april fool2014 by
Npc april fool2014Npc april fool2014
Npc april fool2014Ken Ogura
978 views32 slides
辺彩色 by
辺彩色辺彩色
辺彩色Ken Ogura
8.9K views38 slides
かけざん by
かけざんかけざん
かけざんKen Ogura
1K views21 slides
人間対Pc2 by
人間対Pc2人間対Pc2
人間対Pc2Ken Ogura
1.3K views43 slides
PC解体 by
PC解体PC解体
PC解体Ken Ogura
2K views52 slides

More from Ken Ogura(20)

Npc april fool2014 by Ken Ogura
Npc april fool2014Npc april fool2014
Npc april fool2014
Ken Ogura978 views
辺彩色 by Ken Ogura
辺彩色辺彩色
辺彩色
Ken Ogura8.9K views
かけざん by Ken Ogura
かけざんかけざん
かけざん
Ken Ogura1K views
人間対Pc2 by Ken Ogura
人間対Pc2人間対Pc2
人間対Pc2
Ken Ogura1.3K views
ハッキング実演 by Ken Ogura
ハッキング実演ハッキング実演
ハッキング実演
Ken Ogura11.2K views
Shio dtm by Ken Ogura
Shio dtmShio dtm
Shio dtm
Ken Ogura1.2K views
Cをやりましょう by Ken Ogura
CをやりましょうCをやりましょう
Cをやりましょう
Ken Ogura724 views
April2013 by Ken Ogura
April2013April2013
April2013
Ken Ogura3.8K views
April2013 by Ken Ogura
April2013April2013
April2013
Ken Ogura530 views
Hairetu2 by Ken Ogura
Hairetu2Hairetu2
Hairetu2
Ken Ogura3.4K views
Lunch by Ken Ogura
LunchLunch
Lunch
Ken Ogura1.2K views
Divisor by Ken Ogura
DivisorDivisor
Divisor
Ken Ogura1.2K views
Homework by Ken Ogura
HomeworkHomework
Homework
Ken Ogura1.1K views

計算量