Pfds20120304
- 2. 着想
• 従来:処理単位の計算量を解析
×n
• 処理列の計算量:(各処理の計算量)
• 各処理の計算量を、抑えたい合計計算量 / n で抑える
必要
• ならし解析:処理列の計算量を解析
• 処理列の合計計算量にフォーカス
• 各処理に自由度:重い処理が数回あることを許容可
- 3. 方法
• Amortized Cost (ならしコスト) という概念を導入
• Actual
Cost (実コスト) に対しての仮想コスト
• ならしコストの設定
• (抑えたい合計計算量) >= (ならしコスト) × n
• (ならしコストの和)
>= (実コストの和)
• 上記のように設定、証明できれば次が示せたことに
• (抑えたい合計計算量) >= (実コストの和)
- 4. Phisicist’s Method (Potential Method)
• 日本語:ポテンシャル法
• ポテンシャル関数を使ってならしコストを定義する
• ポテンシャル関数
• データの状態→ 実数 という対応を定義する
• 定義例:スタックに積まれたオブジェクト数
• (ならしコスト和) = (実コスト和) + (現ポテンシャル)
• 次のようなポテンシャル関数 p を定義できれば・・・
• p(D0) = 0
• p(Di) >= 0 (any i)
• (ならしコスト和) >= (実コスト和) が示せたことになる
- 5. 例:スタック(multipopあり)
• multipop:複数個を一度にpopする(最悪計算量は n)
• p(Di):操作 i 後のスタック上のオブジェクト数と定義
• この定義は p(D0) = 0 と p(Di) >= 0 を満たしている
• ならしコストの計算
• push:2 ( = 実コスト(1) + ポテンシャル差(1) )
• pop:0 ( = 実コスト(1) + ポテンシャル差 (-1) )
• multipop:0 ( = 実コスト(n) + ポテンシャル差 (-n) )
• よってならしコストはどれも O(1)
• よって総ならしコストは O(n)
• よって総実コストは O(n)
- 6. Banker’s Method (Accounting Method)
• 日本語:出納法
• ポテンシャル法でのポテンシャル差にフォーカス
• 各処理で預金額(=ポテンシャル差)を決める
• (ならしコスト) = (実コスト) + (預金額)
• 預金総額(=ポテンシャル)が常に非負である必要
- 7. 例:スタック(multipop あり)
• 各処理での預金額を次のように定義
• push:1
• pop:-1
• multipop:-n
• するとならしコストは
• push:2
• pop:0
• multipop:0
• よってならしコストはどれも O(1)
• よって総ならしコストは O(n)
• よって総実コストは O(n)
- 8. 私見
• Banker’s Method の預金を割り当てるロケーション
• 今のところ考える必要がない
• Banker’s Method で預金と借金との区別
• 両方の和で預金だと考えて問題ない
• のか?