SlideShare una empresa de Scribd logo
1 de 77
Descargar para leer sin conexión
計算量のはなし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
● おしまい

Más contenido relacionado

La actualidad más candente

指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端Yoichi Iwata
 
AtCoder Beginner Contest 022 解説
AtCoder Beginner Contest 022 解説AtCoder Beginner Contest 022 解説
AtCoder Beginner Contest 022 解説AtCoder Inc.
 
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解くshindannin
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~Takuya Akiba
 
競技プログラミングでの線型方程式系
競技プログラミングでの線型方程式系競技プログラミングでの線型方程式系
競技プログラミングでの線型方程式系tmaehara
 
部内勉強会 数え上げの基礎
部内勉強会 数え上げの基礎部内勉強会 数え上げの基礎
部内勉強会 数え上げの基礎Kazuma Mikami
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門Yoichi Iwata
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界Preferred Networks
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話Nagisa Eto
 
AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Inc.
 
AtCoder Regular Contest 001
AtCoder Regular Contest 001AtCoder Regular Contest 001
AtCoder Regular Contest 001AtCoder Inc.
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)AtCoder Inc.
 
AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説AtCoder Inc.
 
AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Inc.
 
AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Inc.
 
CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説AtCoder Inc.
 
色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化yosupo
 

La actualidad más candente (20)

指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端
 
AtCoder Beginner Contest 022 解説
AtCoder Beginner Contest 022 解説AtCoder Beginner Contest 022 解説
AtCoder Beginner Contest 022 解説
 
Trianguler
TriangulerTrianguler
Trianguler
 
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
 
Za atsu-20170328
Za atsu-20170328Za atsu-20170328
Za atsu-20170328
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
 
競技プログラミングでの線型方程式系
競技プログラミングでの線型方程式系競技プログラミングでの線型方程式系
競技プログラミングでの線型方程式系
 
部内勉強会 数え上げの基礎
部内勉強会 数え上げの基礎部内勉強会 数え上げの基礎
部内勉強会 数え上げの基礎
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話
 
AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Regular Contest 048
AtCoder Regular Contest 048
 
AtCoder Regular Contest 001
AtCoder Regular Contest 001AtCoder Regular Contest 001
AtCoder Regular Contest 001
 
最大流 (max flow)
最大流 (max flow)最大流 (max flow)
最大流 (max flow)
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)
 
AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説
 
AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説
 
AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Regular Contest 046
AtCoder Regular Contest 046
 
CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説
 
色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化
 

Más de Ken Ogura

Más de 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