アルゴリズムイントロダクション18章 D3照山順一.

Slides:



Advertisements
Similar presentations
アルゴリズムと データ構造 第 3 回 基本的なデータ構造(2) : 配列 1. 前回の復習 アルゴリズムの計算量 最悪(最大)計算量 計算量の漸近的評価 (オーダ)  多項式時間アルゴリズム( polynomial time algorithm )  指数時間アルゴリズム( exponential.
Advertisements

Image J を用いた粒子径分析 目次 1.ImageJ ダウンード・開始 2. 粒子径分析の基本操作.
J: Magical Switches JAG 模擬地区予選 2013 原案:保坂 解答:保坂・楠本 解説:保坂.
4.3 マージソート.
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
全加算回路 A, Bはそれぞれ0または1をとるとする。 下位桁からの繰り上がりをC1とする。(0または1)
2 分探索木 Binary Search Tree 実行可能な操作 計算量 木の高さは,最悪 O(n) n = |A| : 要素の個数
近似アルゴリズム 第10章 終了時刻最小化スケジューリング
データ構造とアルゴリズム 第10回 mallocとfree
「Self-Organizing Map 自己組織化マップ」 を説明するスライド
アルゴリズムイントロダクション第5章( ) 確率論的解析
1. アルゴリズムと計算量.
アルゴリズムとデータ構造 補足資料13-4 「2分探索木の追加・削除(ダイジェスト)」
第10回 ソート(1):単純なソートアルゴリズム
Handel-Cによる       エアホッケー.
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造 第3回基本的なデータ構造(リスト) 2015/10/28 アルゴリズムとデータ構造 2015.
第8回 プログラミングⅡ 第8回
計算値が表の値より小さいので「異なるとは言えない」。
宇野 毅明 国立情報学研究所 2002年3月 東北大大学院 情報科学研究科ワークショップ
プログラミング論 II 電卓,逆ポーランド記法電卓
システム開発実験No.7        解 説       “論理式の簡略化方法”.
アルゴリズムと データ構造 第4回 スタック・キュー.
エージェントを管理するボスの苦悩 問題 n人のエージェントを部下に持つボスがいる. エージェントは出張・帰還を頻繁に繰り返す.
データ構造と アルゴリズム 第八回 知能情報学部 新田直也.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
コンピュータと情報 第15回 Excelの使い方 その4.
データ構造と アルゴリズム 第十一回 理工学部 情報システム工学科 新田直也.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
計算量理論輪講 岩間研究室 照山順一.
第11回 整列 ~ シェルソート,クイックソート ~
コンピュータと情報 第14回 Excelの使い方 その4.
7-3.高度な木 (平衡木) AVL木 平衡2分木。回転操作に基づくバランス回復機構により平衡を保つ。 B木
© Yukiko Abe 2014 All rights reserved
2009/10/16 いろいろなデータ構造 第3講: 平成21年10月16日 (金) 4限 E252教室 コンピュータアルゴリズム.
アルゴリズムとデータ構造1 2006年6月16日
人工知能特論 9.パーセプトロン 北陸先端科学技術大学院大学 鶴岡 慶雅.
画像処理プログラムの説明.
プログラミング演習Ⅱ 課題4第3週 画像処理 (1) ビット演算子.
相関.
オペレーティングシステムJ/K (仮想記憶管理)
 情報の授業 アルゴリズムとプログラム(1) Go.Ota.
第9回 優先度つき待ち行列,ヒープ,二分探索木
アルゴリズムとデータ構造1 2005年7月1日
コードクローンの動作を比較するためのコードクローン周辺コードの解析
コンパイラ資料 実行時環境.
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
アルゴリズムとプログラミング (Algorithms and Programming)
未使用メモリに着目した 複数ホストにまたがる 仮想マシンの高速化
計算の理論 II 時間量と領域量 月曜5校時 大月美佳 2019/4/10 佐賀大学理工学部知能情報システム学科.
プログラミング 4 探索と計算量.
プログラミング 3 スタックとキュー.
Eliminating Amortizations PurelyFunctionalDataStrctures 輪講 第6回
情報数理Ⅱ 第11章 データ構造 平成29年1月18日.
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
基本情報技術概論(第10回) 埼玉大学 理工学研究科 堀山 貴史
コンピュータアーキテクチャ 第 4 回.
Selfish Routing 4章前半 岡本 和也.
第9回 優先度つき待ち行列,ヒープ,二分探索木
基本情報技術概論(第5回) 埼玉大学 理工学研究科 堀山 貴史
Advanced Data Structure 第3回
コンピュータアーキテクチャ 第 4 回.
pf-6. スタック (Python プログラミング基礎を演習で学ぶシリーズ)
4.プッシュダウンオートマトンと 文脈自由文法の等価性
プログラミング演習Ⅱ 課題4第4週 画像処理 (2) 応用.
参考:大きい要素の処理.
データ構造と アルゴリズムI 第三回 知能情報学部 新田直也.
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
プログラミング入門2 第5回 配列 変数宣言、初期化について
プログラミング論 バイナリーサーチ 1.
Presentation transcript:

アルゴリズムイントロダクション18章 D3照山順一

18章:ならし解析 データ構造への操作の平均計算時間「ならしコスト」を考える 操作によってコストが異なる構造 n回の操作をした場合: 全体のコストは?⇔一回当たりのコストは? 操作 :  コスト  A : 1  B(x) : 1  C(k) : f(k) あるデータ構造 A, A, C(2), B(10), A, B(1), B(2), C(5), … 全体のコストは?

流れ 3つの方法を紹介 1.集計法:全体コストをカウント 2.出納法:操作ごとに「ならしコスト」を導入 3.ポテンシャル法: データの状況に値を定めて解析 ポテンシャル関数:状況→値 データ操作例: A.スタック操作 B.2進カウンタ

例1:スタック操作 スタック:LIFOのデータ構造 操作: PUSH(x):x をスタックに入れる POP: スタックの一番上を取り出す MULTIPOP(k): POPをk回行う            データ数が0になってしまったらやめる 1 min( k, 要素数) 1:PUSH(40) 2:PUSH(38) 3:POP 4:MULTIPOP(2) 38 40 17 55

例1:スタック操作 スタック:LIFOのデータ構造 操作がn回行われた時、コストは高々いくらか? 操作: PUSH(x):x をスタックに入れる POP: スタックの一番上を取り出す MULTIPOP(k): POPをk回行う            データ数が0になってしまったらやめる 操作がn回行われた時、コストは高々いくらか? 何も考えずに各段階での最悪コストを考えると、  O(n2) ← タイトではない 1 min( k, 要素数)

例2:2進カウンタ k-ビット2進カウンタ INCREMENT : カウンタを+1する:繰り上がり操作 コスト:データ書き換え(0→1, 1→0)回数 初期値:all 0とし、n回操作した時のコストは? 最悪を考えると、O(kn) 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0

集計法 操作全体を見て、総コストを考える: [スタック操作]総コスト T(n) = O(n) POP, MULTIPOP の合計コストは スタックにPUSHされる数程度しかない PUSHの回数は高々n ならしコストはO(1)

集計法 操作全体を見て、総コストを考える: [2進カウンタ] T(n) = O(n) 各bitについてデータが書き変わる回数を考える 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 1 1 1 0 0 1 0 0 0

出納法:accounting method 操作ごとに異なるコスト(ならしコスト)を導入   : 実際のコスト   : ならしコスト 設定の条件:各操作後において 操作 :  コスト  :  ならしコスト  A : 1   :    5  B(x) : 1   :    10  C(k) : f(k) :    0

出納法:accounting method 操作ごとに異なるコスト(ならしコスト)を導入   : 実際のコスト   : ならしコスト 設定の条件:各操作後において [スタック操作] PUSH 2 POP 0 MULTIPOP 0 *POP・MULTIPOPのコストをPUSHが先払い

出納法:accounting method 操作ごとに異なるコスト(ならしコスト)を導入   : 実際のコスト   : ならしコスト 設定の条件:各操作後において [2進カウンタ] 0→1 2 1→0 0 *繰り上がり時のコストを先払い

ポテンシャル法 データ構造の状態に関して値を設定   : ポテンシャル関数 となるように設定

ポテンシャル法 データ構造の状態に関して値を設定   : ポテンシャル関数

ポテンシャル法 [スタック操作] = スタック内の要素数 PUSH POP MULTIPOP 1 k -k 1 2 データ構造の状態に関して値を設定   : ポテンシャル関数 [スタック操作]     = スタック内の要素数 PUSH POP MULTIPOP 2 1 k -k 1

ポテンシャル法 [2進カウンタ] = カウンタの 1の数= bi ti = i 回目の操作で起こる1→0の個数 データ構造の状態に関して値を設定   : ポテンシャル関数 [2進カウンタ]     = カウンタの 1の数= bi ti = i 回目の操作で起こる1→0の個数 0 0 1 0 1 1 1 1 0 0 1 1 0 0 0 0

動的な表 これまでの解析法を別の例を用いて考える 表に対するメモリ割当 操作:INSERT、DELETE 現実的問題: 1:要素に対して多くの領域を確保しておくと損 負荷率 : 表の大きさに対する要素の割合 負荷率を定数以上に保ちたい 2:領域がいっぱいの時に要素が追加される時、   より大きな領域を確保する必要がある

動的な表 INSERTのみの状況を考える 表がいっぱいだったら、 1:2倍の領域を確保する 2:もともとのデータをコピーする 負荷率 : 1/2以上保たれる 操作  :    コスト INSERT  :     1 COPY   : コピーデータ数 1 + 1 + ( 2 + 1 ) + 1 + ( 4 + 1) + 1 + 1 + 1 + ( 8 + 1 ) + ・・・

動的な表:集計法 集計法 : コピーが起こるのは i = 2j の時のみ 操作:INSERTのみ 表がいっぱいだったら、 1:2倍の領域を確保する 2:もともとのデータをコピーする INSERT  :     1 COPY   : コピーデータ数 集計法 : コピーが起こるのは i = 2j の時のみ

動的な表:出納法 出納法 : 要素追加 : 3 コピー : 0 操作:INSERTのみ 表がいっぱいだったら、 1:2倍の領域を確保する 2:もともとのデータをコピーする INSERT  :     1 COPY   : コピーデータ数 出納法 : 要素追加 : 3 コピー  : 0 1 1 ならしコスト3の内訳 1:実際の追加コスト 2:コピーされる時のための貯金 3:一度コピーされたことのある   要素のための貯金 3 1 1

動的な表:ポテンシャル法 ポテンシャル法 : f(T) = 2[Tの要素数] - [Tの領域] 1 2 (要素:+1,領域:±0) 3 初期値0 拡大直後は f(T) = 0 拡大なし 拡大あり 1 2 (要素:+1,領域:±0) 3 拡大前の要素数+1 2 - 拡大前の領域 3

動的な表(2) DELETEがある場合も考える データが少なくなってきたら表の大きさを縮小 INSERT: DELETE: 要素1つ追加 表がいっぱいなら領域2倍+コピー DELETE: 要素1つ削除 負荷率がある値未満になったら、領域半分+コピー DELETE数回 領域確保+コピー

動的な表(2) DELETE:負荷率がある値未満になったら、領域半分+コピー 1/2とするとちょっと問題がある: ある値をどうするか? 1/2とするとちょっと問題がある: 総コストO(n2) → ならしコストO(n) size = M INSERT INSERT cost =1 cost = M+1 DELETE DELETE cost = M cost =1

動的な表(2) DELETE:負荷率がある値未満になったら、領域半分+コピー 解決法:表の1/4未満で表を半分に 負荷率(α)は常に1/4以上 ならしコストが定数 ポテンシャル法を用いて確認 ポテンシャル関数 : num[T] : Tの要素数 size[T] : Tの領域 α(T) : Tの負荷率 = num[T]/size[T]

動的な表(2):解析(1/8) 解析の場合分け: (1) 操作 : INSERT or DELETE

動的な表(2) :解析(2/8) INSERTのみでの解析と 同じポテンシャル関数なので ならしコストは高々3 解析の場合分け: DELETE : 表の1/4未満、領域半分+コピー 解析の場合分け: (1) 操作     : INSERT or DELETE (2)  負荷率   : 1/2以上 or 1/2未満 (3) 拡大・縮小 : 有 or 無 INSERTのみでの解析と 同じポテンシャル関数なので ならしコストは高々3

動的な表(2) :解析(3/8) (4) 追加しても負荷率が1/2を超えない 解析の場合分け: INSERT : 表がいっぱいなら、領域2倍+コピー DELETE : 表の1/4未満、領域半分+コピー 解析の場合分け: (1) 操作     : INSERT or DELETE (2)  負荷率   : 1/2以上 or 1/2未満 (3) 拡大・縮小 : 有 or 無 (4) 追加しても負荷率が1/2を超えない α=1の時にしか拡大は起こらない。

動的な表(2) :解析(4/8) (4) 追加で負荷率が1/2となる 解析の場合分け: (1) 操作 : INSERT or DELETE (4) 追加で負荷率が1/2となる α=1の時にしか拡大は起こらない。

動的な表(2) :解析(5/8) (4) 削除でも負荷率が1/2以上 解析の場合分け: (1) 操作 : INSERT or DELETE (4) 削除でも負荷率が1/2以上 負荷率が1/4未満にはならない 差が1 同じ

動的な表(2) :解析(6/8) (4) 削除で負荷率が1/2未満 解析の場合分け: (1) 操作 : INSERT or DELETE (4) 削除で負荷率が1/2未満 負荷率が1/4未満にはならない 縮小前の負荷率は1/2

動的な表(2) :解析(7/8) 解析の場合分け: (1) 操作 : INSERT or DELETE 縮小前の負荷率は1/4 (領域4以上) 縮小後の負荷率は1/2未満

動的な表(2) :解析(8/8) 解析の場合分け: (1) 操作 : INSERT or DELETE 同じ 差が1

動的な表(2):まとめ DELETE:負荷率がある値未満になったら、領域半分+コピー 解決法:表の1/4未満で表を半分に 負荷率(α)は常に1/4以上 ならしコストが定数 すべての状況において ならしコストが定数であることが確認された。 ポテンシャル法を用いて確認 ポテンシャル関数 :