SlideShare a Scribd company logo
1 of 77
Download to read offline
計算量のはなし2
~DequeはStack2つでつくれる~
目次
● 有名なことわざの紹介
● ならし計算量のはなし
●
Accounting Method
● Potential Method
目次
● 有名なことわざの紹介
● ならし計算量のはなし
●
Accounting Method
● Potential Method
有名なことわざ
DequeはStack2つでつくれる
Deque
● 次の操作に対応したデータ構造
– 列の先頭に値を追加  (pushF)
– 列の末尾に値を追加  (pushB)
– 列の先頭から値を取り出す (popF)
– 列の末尾から値を取り出す (popB)
Deque: 図示
● ここに空のDequeがあるじゃろ
– 左が先頭(Front), 右が末尾 (Back)
Deque: 図示
● pushF(3)
3
Deque: 図示
● pushF(3), pushB(4)
3 4
Deque: 図示
● pushF(3), pushB(4), pushF(5)
3 45
Deque: 図示
● pushF(3), pushB(4), pushF(5), popB()
3
4
5
4
Deque: 図示
● pushF(3), pushB(4), pushF(5), popB()
35
Deque: 図示
● pushF(3), pushB(4), pushF(5), popB(), popF()
3
5
Deque: 図示
● pushF(3), pushB(4), pushF(5), popB(), popF()
3
Deque: 図示
● pushF(3), pushB(4), pushF(5), popB(), popF()
pushB(4)
3 4
Deque: 図示
● pushF(3), pushB(4), pushF(5), popB(), popF()
pushB(4), pushF(3)
3 433
有名なことわざ(再掲)
DequeはStack2つでつくれる
Deque(Stack×2): 図示
● 空のDequeの下にStackが2つあるじゃろ
– 左が先頭(Front), 右が末尾 (Back)
432
Deque(Stack×2): 図示
● pushF(1), pushF(2), pushF(3), pushF(4)
4321
1
432
Deque(Stack×2): 図示
● pushF(1), pushF(2), pushF(3), pushF(4)
popB()
4
321
1
32
Deque(Stack×2): 図示
● pushF(1), pushF(2), pushF(3), pushF(4)
popB()
4
321
1
エイヤッ
4
32
Deque(Stack×2): 図示
● pushF(1), pushF(2), pushF(3), pushF(4)
popB()
4
321
1
4
32
Deque(Stack×2): 図示
● pushF(1), pushF(2), pushF(3), pushF(4)
popB()
321
1
32
Deque(Stack×2): 大事な所
● PopしたいのにStackがからの時、もう片方の
Stackの半分を移してくる
4
321
1
エイヤッ
4
フハハ
Dequeはこのようにして
Stack2つでつくれるのじゃ
目次
● 有名なことわざの紹介
● ならし計算量のはなし
●
Accounting Method
● Potential Method
半分うつすのやばそう
● Stack2つで実装したDequeの計算量を評価し
てみよう
操作一覧
● pushBack
● pushFront
●
popBack
● popFront
操作一覧
● pushBack どうせO(1)
● pushFront どうせO(1)
●
popBack
● popFront
操作一覧
● pushBack どうせO(1)
● pushFront どうせO(1)
●
popBack だいたいO(1)
● popFront だいたいO(1)
半分移すとき時間かかる
● pushBack どうせO(1)
● pushFront どうせO(1)
●
popBack だいたいO(1)  ときどき O(N)
● popFront だいたいO(1) ときどき O(N)
半分移すとき時間かかる
● pushBack どうせO(1)
● pushFront どうせO(1)
●
popBack だいたいO(1)  ときどき O(N)
● popFront だいたいO(1) ときどき O(N)
●
でもO(N)であることは本当に「ときどき」で、ま
れにしか起こらない
半分移すとき時間かかる
● pushBack どうせO(1)
● pushFront どうせO(1)
●
popBack だいたいO(1)  ときどき O(N)
● popFront だいたいO(1) ときどき O(N)
●
でもO(N)であることは本当に「ときどき」で、ま
れにしか起こらない
半分移すとき時間かかる
●
pushBack どうせO(1)
●
pushFront どうせO(1)
●
popBack だいたいO(1)  ときどき O(N)
●
popFront だいたいO(1) ときどき O(N)
●
でもO(N)であることは本当に「ときどき」で、まれに
しか起こらない
●
O(N)っていいたくない
そんなときに便利なのが
ならし計算量
ならし計算量とは
● データ構造に対する操作の計算量の評価で
使われる「計算量もどき」
● 時と場合によって計算量がかわるが、均すと
O(f(x))になるとき
「ならし計算量がO(f(x))である」
という
ならし計算量とは
● データ構造に対する操作の計算量の評価で
使われる「計算量もどき」
● 時と場合によって計算量がかわるが、均すと
O(f(x))になるとき
「ならし計算量がO(f(x))である」
という
ならし計算量とは
● データ構造に対する操作の計算量の評価で
使われる「計算量もどき」
● 時と場合によって計算量がかわるが、均すと
O(f(x))になるとき
「ならし計算量がO(f(x))である」
という
?
「均す」とは
●
データ構造の中で、操作をN回やった時、「実
際の計算量」の総和と「ならし計算量」の総和
がだいたい同じになる
●
例:
– Dequeのpopの実際の計算量
●
O(1)だったりO(N)だったり
– Dequeのpopのならし計算量
●
O(1)
Dequeの計算量
● Dequeの操作のならし計算量は全てO(1)
– ほんまか
● ならし計算量がO(1)ということは N 回操作し
たときの「実際の計算量」がO(N)であるという
こと
– 実験してみるとそれっぽい
● これから2つの方法でこれを証明する
目次
● 有名なことわざの紹介
● ならし計算量のはなし
●
Accounting Method
● Potential Method
AccountingMethod
● 直訳:会計法(法律っぽい)
● 初めあなたの所持金は0円です
●
あなたが操作をするたびに、「ならし計算量」
円だけお金がふってきます
● あなたが操作をするたびに、「実際の計算
量」円払わなければなりません
● あなたはどのタイミングでも所持金が負に
なってはいけません
AccountingMethod
● 何円ふってくるか、うまく決めて所持金が負に
ならなければそれがならし計算量
●
うまく思いつこう!
AccountingMethod
● 以下のように設定するとうまくいく
– 操作をすると 5 円ふってくる
AccountingMethod
● 以下のように設定するとうまくいく
– 操作をすると 5 円ふってくる
●
これでうまくいくことをこれから証明
AccountingMethod:5円の証明
● pushBack,pushFront
– 実際の計算量は 1
– よって1円払わないといけない
●
popBack,popFrontのエイヤッしないやつ
– 実際の計算量は 1
– 1円払わないといけない
● どちらの場合も差し引いて4円貯金が増える
AccountingMethod:5円の証明
● popBack,popFrontのエイヤッするとき
– もう片方のStackの中身(N個とする)をいっ
たん全部出して、半分ずつ入れ分ける
– 実際の計算量は 2N
– 差し引いて2N-5円貯金が減る
● このとき借金しなければよい
AccountingMethod:5円の証明
● 実は以下の命題が成り立つ
– 左側のStackにL個、右側のStackにR個の
要素が入ってる時、4×max(L, R)円以上の
貯金がある
– 帰納法で証明可能
AccountingMethod:4*max(L,R)の証明
●
命題:貯金が4×max(L,R)円以上
●
はじめの状態(空の状態)では成立
●
成立している状態からどの操作をしても命題が成立
し続けることを示せば良い
 
 
AccountingMethod:4*max(L,R)の証明
●
命題:貯金が4×max(L,R)円以上
●
はじめの状態(空の状態)では成立
●
成立している状態からどの操作をしても命題が成立
し続けることを示せば良い
– pushとエイヤッしないpopは 貯金が4円増えるので成
立し続ける
 
 
AccountingMethod:4*max(L,R)の証明
●
命題:貯金が4×max(L,R)円以上
●
はじめの状態(空の状態)では成立
●
成立している状態からどの操作をしても命題が成立
し続けることを示せば良い
– pushとエイヤッしないpopは 貯金が4円増えるので成
立し続ける
– エイヤッするとき、もともと貯金が4N円以上あるので
操作後は2N円以上が保証される
 
AccountingMethod:4*max(L,R)の証明
●
命題:貯金が4×max(L,R)円以上
●
はじめの状態(空の状態)では成立
●
成立している状態からどの操作をしても命題が成立
し続けることを示せば良い
– pushとエイヤッしないpopは 貯金が4円増えるので成
立し続ける
– エイヤッするとき、もともと貯金が4N円以上あるので
操作後は2N円以上が保証される
– エイヤッ後は4×max(L,R)は2Nになる
AccountingMethod:4*max(L,R)の証明
●
命題:貯金が4×max(L,R)円以上
●
はじめの状態(空の状態)では成立
●
成立している状態からどの操作をしても命題が成立
し続けることを示せば良い
– pushとエイヤッしないpopは 貯金が4円増えるので成
立し続ける
– エイヤッするとき、もともと貯金が4N円以上あるので
操作後は2N円以上が保証される
– エイヤッ後は4×max(L,R)は2Nになる 成立し続ける
AccountingMethod:4*max(L,R)の証明
●
命題:貯金が4×max(L,R)円以上
●
はじめの状態(空の状態)では成立
●
成立している状態からどの操作をしても命題が成立
し続けることを示せば良い
– pushとエイヤッしないpopは 貯金が4円増えるので成
立し続ける
– エイヤッするとき、もともと貯金が4N円以上あるので
操作後は2N円以上が保証される
– エイヤッ後は4×max(L,R)は2Nになる 成立し続ける
(Q.E.D.)
これが
Accounting Method
AccountingMethod
●
ならしO(1)を求めるのに向いてる
– ふってくる値段を貯金がなくならないように充
分大きくするだけ
●
ふってくる値段は操作毎に変えても良い
– popは4円
– pushは1円とかでも大丈夫
●
今回のようにデータ構造の状態に対して貯金の
下限を示したりして使う
AccountingMethod:演習問題
● 以下をAccountingMethodで示してみよ
●
動的にメモリを確保する配列(vector)の
push_backのならし計算量:O(1)
– メモリがなくなったら別の場所にいまの2倍
の大きさのメモリを確保します
目次
● 有名なことわざの紹介
● ならし計算量のはなし
●
Accounting Method
● Potential Method
PotentialMethod
● データ構造の状態に対してPotentialという値
を定義する
● ある操作をしてPotentailがP1からP2に変わっ
たとする
●
そのならし計算量を
「実際の計算量」 + P2 – P1
として定義する
PotentialMethod:なんでそんなことするの
● 長い処理を考える
PotentialMethod:なんでそんなことするの
● 長い処理を考える
状態   Potential 実計算量  均計算量
C1
C2
C3
CN
:
:
P1
P2
P3
PN
:
:
X1
X2
XN
:
:
PotentialMethod:なんでそんなことするの
● ポテンシャルと実計算量から均計算量を出す
状態   Potential 実計算量  均計算量
C1
C2
C3
CN
:
:
P1
P2
P3
PN
:
:
X1
X2
XN
:
:
X1+P2-P1
X2+P3-P2
XN+PN-(ry
:
:
PotentialMethod:なんでそんなことするの
● 計算量の総和を考えてみる
状態   Potential 実計算量  均計算量
C1
C2
C3
CN
:
:
P1
P2
P3
PN
:
:
X1
X2
XN
:
:
X1+P2-P1
X2+P3-P2
XN+PN-(ry
:
:
PotentialMethod:なんでそんなことするの
● 計算量の総和を考えてみる
●
実計算量
– X1 + X2 + X3 + … + XN
●
均計算量
– (X1 + P2 – P1) + (X2 + P3 – P2) + … (ry
↓
– X1 + X2 + X3 + … + XN + (PN – P1)
PotentialMethod:なんでそんなことするの
● 計算量の総和を考えてみる
●
実計算量
– X1 + X2 + X3 + … + XN
●
均計算量
– (X1 + P2 – P1) + (X2 + P3 – P2) + … (ry
↓
– X1 + X2 + X3 + … + XN + (PN – P1)
PotentialMethod:なんでそんなことするの
● 「実計算量の総和」と「均計算量の総和」の差
が PN – P1
– 終状態と始状態のPotentialの差
– これが「均計算量の総和」以下のオーダー
なら、実計算量と均計算量のオーダーが一
致する
– 均計算量の定義と合致
PotentialMethod:Dequeのポテンシャル
● うまいポテンシャルを見つけて、どんな操作も
均計算量がO(1)であることを示せば良い
PotentialMethod:Dequeのポテンシャル
● うまいポテンシャルを見つけて、どんな操作も
均計算量がO(1)であることを示せば良い
●
今回は左側のStackの要素数をL、右側の
Stackの要素数をRとして
4*max(L, R)
をPotentialとするとうまくいく
PotentialMethod:4*max(L,R)の証明
● 各操作の均計算量
– push
● ポテンシャルはたかだか4増える
● 実計算量は1
● よってならし計算量は5
PotentialMethod:4*max(L,R)の証明
● 各操作の均計算量
– pop(エイヤッなし)
● ポテンシャルは増えない
● 実計算量は1
● よってならし計算量は1以下
PotentialMethod:4*max(L,R)の証明
● 各操作の均計算量
– pop(エイヤッあり)
● ポテンシャルは4*(N/2)減る
● 実計算量は2N
● よってならし計算量は0
PotentialMethod:4*max(L,R)の証明
● PN-P1
– N回操作した後の均計算量の総和はO(N)
– PN-P1の最大値は4N=O(N)
●
ずっと同じ方からpushしたとき
– よっしゃ
PotentialMethod:4*max(L,R)の証明
● ポテンシャル4*max(L,R)での均計算量がす
べてO(1)でした
PotentialMethod:4*max(L,R)の証明
● ポテンシャル4*max(L,R)での均計算量がす
べてO(1)でした
(Q.E.D.)
これが
Potential Method
PotentialMethod
●
ならしO(1)以外を求めるのにも有用
– フィボナッチヒープのO(logN)
– スプレー木のO(logN)
– UnionFind木のO(α(n)) (アッカーマン関数の
逆関数)
●
4*max(L,R)はAccountingMethodにもでてきた値
– AccountingもPotentialも歩み寄り方が違うだ
けで、やりたい証明は同じ
PotentialMethod:演習問題
● 以下をPotentialMethodで示してみよ
●
動的にメモリを確保する配列(vector)の
push_backのならし計算量:O(1)
– メモリがなくなったら別の場所にいまの2倍
の大きさのメモリを確保します
目次
● 有名なことわざの紹介
● ならし計算量のはなし
●
Accounting Method
● Potential Method
● おしまい

More Related Content

What's hot

Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話Nagisa Eto
 
色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化yosupo
 
様々な全域木問題
様々な全域木問題様々な全域木問題
様々な全域木問題tmaehara
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~Takuya Akiba
 
LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~Yuma Inoue
 
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとはTakuya Akiba
 
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方Kensuke Otsuki
 
高速フーリエ変換
高速フーリエ変換高速フーリエ変換
高速フーリエ変換AtCoder Inc.
 
KMC 競技プログラミング練習会 Advanced 第3回 ふろー
KMC 競技プログラミング練習会 Advanced 第3回 ふろーKMC 競技プログラミング練習会 Advanced 第3回 ふろー
KMC 競技プログラミング練習会 Advanced 第3回 ふろーkyoto university
 
AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説AtCoder Inc.
 
AtCoder Beginner Contest 005 解説
AtCoder Beginner Contest 005 解説AtCoder Beginner Contest 005 解説
AtCoder Beginner Contest 005 解説AtCoder Inc.
 
AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説AtCoder Inc.
 
2SAT(充足可能性問題)の解き方
2SAT(充足可能性問題)の解き方2SAT(充足可能性問題)の解き方
2SAT(充足可能性問題)の解き方Tsuneo Yoshioka
 
ユークリッド最小全域木
ユークリッド最小全域木ユークリッド最小全域木
ユークリッド最小全域木理玖 川崎
 
実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)AtCoder Inc.
 

What's hot (20)

Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話
 
色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化
 
様々な全域木問題
様々な全域木問題様々な全域木問題
様々な全域木問題
 
Abc009
Abc009Abc009
Abc009
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
 
LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~
 
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは
 
Rolling hash
Rolling hashRolling hash
Rolling hash
 
最大流 (max flow)
最大流 (max flow)最大流 (max flow)
最大流 (max flow)
 
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
 
高速フーリエ変換
高速フーリエ変換高速フーリエ変換
高速フーリエ変換
 
KMC 競技プログラミング練習会 Advanced 第3回 ふろー
KMC 競技プログラミング練習会 Advanced 第3回 ふろーKMC 競技プログラミング練習会 Advanced 第3回 ふろー
KMC 競技プログラミング練習会 Advanced 第3回 ふろー
 
AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説
 
AtCoder Beginner Contest 005 解説
AtCoder Beginner Contest 005 解説AtCoder Beginner Contest 005 解説
AtCoder Beginner Contest 005 解説
 
Trianguler
TriangulerTrianguler
Trianguler
 
AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説
 
2SAT(充足可能性問題)の解き方
2SAT(充足可能性問題)の解き方2SAT(充足可能性問題)の解き方
2SAT(充足可能性問題)の解き方
 
ユークリッド最小全域木
ユークリッド最小全域木ユークリッド最小全域木
ユークリッド最小全域木
 
arc047
arc047arc047
arc047
 
実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)
 

More from Ken Ogura

More from Ken Ogura (20)

Deque with Haskel
Deque with HaskelDeque with Haskel
Deque with Haskel
 
Npc april fool2014
Npc april fool2014Npc april fool2014
Npc april fool2014
 
計算量
計算量計算量
計算量
 
辺彩色
辺彩色辺彩色
辺彩色
 
かけざん
かけざんかけざん
かけざん
 
人間対Pc2
人間対Pc2人間対Pc2
人間対Pc2
 
PC解体
PC解体PC解体
PC解体
 
ハッキング実演
ハッキング実演ハッキング実演
ハッキング実演
 
Shio dtm
Shio dtmShio dtm
Shio dtm
 
Cをやりましょう
CをやりましょうCをやりましょう
Cをやりましょう
 
April2013
April2013April2013
April2013
 
April2013
April2013April2013
April2013
 
Mage
MageMage
Mage
 
Imo
ImoImo
Imo
 
Hairetu2
Hairetu2Hairetu2
Hairetu2
 
Moon
MoonMoon
Moon
 
Jissou
JissouJissou
Jissou
 
Lunch
LunchLunch
Lunch
 
Divisor
DivisorDivisor
Divisor
 
Homework
HomeworkHomework
Homework
 

Amortize analysis of Deque with 2 Stack