PowerPoint Presentation

Similar documents
PowerPoint Presentation

memo

Microsoft PowerPoint - DA1_2018.pptx

Microsoft PowerPoint - DA1_2018.pptx

Microsoft PowerPoint - DA1_2019.pptx

INTRODUCTION TO ALGORITHMS

プログラム言語及び演習Ⅲ

データ構造と  アルゴリズムⅠ

Microsoft PowerPoint - algo ppt [互換モード]

memo

memo

Microsoft PowerPoint - kougi10.ppt

Microsoft PowerPoint - 05.pptx

Microsoft PowerPoint - algo ppt [互換モード]

Microsoft PowerPoint - 06.pptx

Taro-再帰関数Ⅲ(公開版).jtd

Microsoft PowerPoint - 13approx.pptx

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

PowerPoint Presentation

Microsoft PowerPoint - 7.pptx

memo

始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル

模擬試験問題(第1章~第3章)

Microsoft Word - 13

論理と計算(2)

Microsoft PowerPoint - IntroAlgDs pptx

Microsoft PowerPoint - ca ppt [互換モード]

論理と計算(2)

Microsoft PowerPoint - DA2_2019.pptx

アルゴリズムとデータ構造

memo

Microsoft PowerPoint - DA2_2017.pptx

Taro-再帰関数Ⅱ(公開版).jtd

alg2015-4r2.ppt

Microsoft PowerPoint - 6.pptx

memo

COMPUTING THE LARGEST EMPTY RECTANGLE

Taro-2分探索木Ⅰ(公開版).jtd

PowerPoint Template

オートマトン 形式言語及び演習 1. 有限オートマトンとは 酒井正彦 形式言語 言語とは : 文字列の集合例 : 偶数個の 1 の後に 0 を持つ列からなる集合 {0, 110, 11110,

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

第2回

Microsoft PowerPoint - 5.pptx

Taro-スタック(公開版).jtd

2014年度 信州大・医系数学

Microsoft PowerPoint - ppt-7.pptx

DA13

Microsoft PowerPoint - IntroAlgDs pptx

PowerPoint Presentation

データ構造

Microsoft PowerPoint - kougi9.ppt

Microsoft Word - no206.docx

Microsoft PowerPoint - ad11-09.pptx

Microsoft PowerPoint - kougi11.ppt

memo

Microsoft PowerPoint - mp13-07.pptx

Microsoft PowerPoint - IntroAlgDs ppt

Microsoft PowerPoint - DA2_2018.pptx

Microsoft PowerPoint - mp11-06.pptx

メソッドのまとめ

Quick Sort 計算機アルゴリズム特論 :2017 年度 只木進一

kiso2-09.key

PG13-6S

Microsoft PowerPoint - IntroAlgDs ppt [互換モード]

program7app.ppt

生命情報学

Microsoft PowerPoint - 10.pptx

Microsoft Word - 12

第2回

Microsoft PowerPoint - DA2_2017.pptx

構造化プログラミングと データ抽象

情報処理Ⅰ

混沌系工学特論 #5

2-1 / 語問題 項書換え系 4.0. 準備 (3.1. 項 代入 等価性 ) 定義 3.1.1: - シグネチャ (signature): 関数記号の集合 (Σ と書く ) - それぞれの関数記号は アリティ (arity) と呼ばれる自然数が定められている - Σ (n) : アリ

PowerPoint プレゼンテーション

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

構造化プログラミングと データ抽象

Taro-最大値探索法の開発(公開版

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

Microsoft PowerPoint - 05DecisionTree-print.ppt

概要 プログラミング論 変数のスコープ, 記憶クラス. メモリ動的確保. 変数のスコープ 重要. おそらく簡単. 記憶クラス 自動変数 (auto) と静的変数 (static). スコープほどではないが重要.

第9回 配列(array)型の変数

Microsoft Word - no12.doc

前期募集 令和 2 年度山梨大学大学院医工農学総合教育部修士課程工学専攻 入学試験問題 No.1/2 コース等 メカトロニクス工学コース 試験科目 数学 問 1 図 1 は, 原点 O の直交座標系 x,y,z に関して, 線分 OA,OB,OC を 3 辺にもつ平行六面体を示す. ここで, 点 A

PowerPoint プレゼンテーション

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

PowerPoint プレゼンテーション

Microsoft PowerPoint SIGAL.ppt

Microsoft PowerPoint - IntroAlgDs pptx

memo

Microsoft PowerPoint - Pro110111

A Constructive Approach to Gene Expression Dynamics

memo

PowerPoint Presentation

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

プログラミング入門1

スライド 1

データ構造

Microsoft PowerPoint - 5.ppt [互換モード]

Transcription:

算法数理工学 第 回 定兼邦彦

クイックソートの 確率的アルゴリズム クイックソートの平均的な場合の実行時間を解析する場合, 入力の頻度を仮定する必要がある. 通常は, すべての順列が等確率で現れると仮定 しかし実際にはこの仮定は必ずしも期待できない この仮定が成り立たなくてもうまく動作するクイックソートの確率的アルゴリズムを示す

確率的 radomized) アルゴリズム 動作が入力だけでなく乱数発生器 radomumber geerator) に依存するアルゴリズム 関数 RANDOMa,b): a 以上 b 以下の整数を等確率で返すとする. プログラミング言語は擬似乱数発生器 pseudoradom-umber geerator) を備える 擬似乱数 : 統計的にはランダムに見えるが, 決定的に作られる数 の列 ) 3

乱数発生法 {0,,, p} の整数を一様ランダムに生成 C 言語 it x; x = rad) % p; // 整数乱数を p で割った余り 4

乱数の種の設定 現在時刻を乱数の種にする C 言語 sradit)cloc)); sradit)timenull)); 5

確率的アルゴリズム クイックソートを行う前に入力配列の要素をランダムに並び替える 実行時間は入力順序に依存しなくなる アルゴリズムがうまく動作しないのは, 乱数発生器によって運の悪い順列を作る場合のみ 最悪の実行時間は改善されない )) 最悪の場合はほとんど起きない 6

確率的アルゴリズム 配列を A[p..r] を分割する前に, A[p] と A[p..r] からランダムに選んだ要素を交換 pivot が rp+ 個の要素から等確率で選ばれることを保障する 分割が平均的にはバランスのとれたものになることが期待できる 7

it RANDOMIZED_PARTITIONdata *A, it p, it r) { it i; data tmp; i = RANDOMp,r); tmp = A[i]; A[i] = A[p]; A[p] = tmp; // 値の交換 retur PARTITIONA,p,r); } void RANDOMIZED_QUICKSORTdata *A, it p, it r) { it q; if p < r) { q = RANDOMIZED_PARTITIONA,p,r); RANDOMIZED_QUICKSORTA,p,q); RANDOMIZED_QUICKSORTA,q+,r); } } 8

最悪の場合の解析 T): サイズ の入力に対する QUICKSORT の最悪実行時間 T ) max q T q) T q) ) T) = O ) を示す m < に対し Tm) cm と仮定 9

0 ) ) ) ) ) ) max ) ) ) max ) c c c c q q c q T q T T q q c は c) が ) の項よりも大きくなるように十分大きくとるよって T) = O ) が示された

平均的な場合の解析 T): サイズ の入力に対する RANDOMIZED QUICKSORT の平均実行時間 T) に関する漸化式を解く 入力データはすべて異なる数とする

分割の解析 RANDOMIZED_PARTITION で PARTITION が呼ばれるとき,A[p] の要素は A[p..r] のランダムな要素と置き換えられている. 観察 :PARTITION によって返される q の値は A[p..r] の中での x = A[p] のランクのみに依存 x のランク rax) = 集合中の x 以下の要素数 要素数 = rp+ rax) = i となる確率は /

rax) = のとき,PARTITION でのループは i = j = p で終了 このとき q = j = p つまり分割の小さい方のサイズは. この事象が起きる確率は / rax) のとき,x = A[p] より小さい値が少なくとも つ存在 PARTITION での最初のループ実行後は i = p,j > p A[i] と A[j] を入れ替えるため,x = A[p] は右の分割に入る 3

PARTITION が停止したとき, 左の分割には rax) 個の要素があり, それらは x より小さい rax) のとき, 左の分割のサイズが i である確率は / i =,,...,-) rax) が の場合と 以上の場合を合わせると, 左の分割のサイズ rp+ が になる確率 : / i になる確率 : / i =,3,...,-) 4

平均時に対する漸化式 T): 要素の入力配列をソートするのに必要な平均時間 T) = ) 長さ の配列に対してソートする場合 配列の分割 : ) 時間 統治 : 長さ q と q の部分配列を再帰的にソート T ) T) T ) q T q) T q)) ) 5

6 ) O ) O ) ) ) T T T)=), T) = O ) よりよって T) は次のように書ける ) ) ) )) ) ) T q T q T T q

7 m < に対し Tm) am lg m + b a>0, b>0) と仮定 ) ) lg ) ) lg ) ) ) b a b a T T 8 lg lg を用いる a 4 が )+b 以上になるように a を選ぶと

8 b a a b b a b a a b a T lg 4 ) lg ) 4 lg ) ) 8 lg ) T) においても成り立つよってクイックソートの平均実行時間は O lg )

9 8 lg lg の証明 / / / / / / / 8 lg )lg lg lg ) lg lg lg lg lg lg

ヒープソート O lg ) 時間アルゴリズム, i-place ヒープ heap) と呼ばれるデータ構造を用いる ヒープはプライオリティキュー priority queue) を効率よく実現する 0

ヒープ ヒープ : 完全 分木とみなせる配列 木の各節点は配列の要素に対応 木は最下位レベル以外の全てのレベルの点が完全に詰まっている 最下位のレベルは左から順に詰まっている 6 3 4 0 4 5 6 7 8 7 9 3 8 9 0 4 3 4 5 6 7 8 9 0 6 4 0 8 7 9 3 4

ヒープを表す構造体 typedef struct { it legth; it heap_size; data *A; } HEAP; // 配列 A に格納できる最大要素数 // ヒープに格納されている要素の数 // 要素を格納する配列 ヒープに後から要素を追加する場合があるとき, 配列 A は大きいものを確保しておく

legthh): 配列 A に格納できる最大要素数 heap_sizeh): H に格納されているヒープの要素数 heap_sizeh) legthh) 木の根 : A[] 節点の添え字が i のとき 親 PARENTi) = i / 左の子 LEFTi) = i 右の子 RIGHTi) = i + 木の高さは lg ) 6 3 4 0 4 5 6 7 8 7 9 3 8 9 0 4 3

ヒープ条件 Heap Property) 根以外の任意の節点 i に対して A[PARENTi)] A[i] つまり, 節点の値はその親の値以下 ヒープの最大要素は根に格納される 4

ヒープの操作 HEAPIFY: ヒープ条件を保持する. BUILD_HEAP: 入力の配列からヒープを構成する. 線形時間. HEAPSORT: 配列をソートする. O lg ) 時間. EXTRACT_MAX: ヒープの最大値を取り出す. Olg ) 時間. INSERT: ヒープに値を追加する. Olg ) 時間. 5

ヒープ条件の保持 HEAPIFYH,i): A[i] を根とする部分木がヒープになるようにする. ただし LEFTi) と RIGHTi) を根とする 分木はヒープと仮定. void HEAPIFYHEAP *H, it i) { it l, r, largest, heap_size; data tmp, *A; A = H->A; heap_size = H->heap_size; l = LEFTi); r = RIGHTi); if l <= heap_size && A[l] > A[i]) largest = l; // A[i] と左の子で大きい else largest = i; // 方をlargestに if r <= heap_size && A[r] > A[largest]) // 右の子の方が大きい largest = r; if largest!= i) { tmp = A[i]; A[i] = A[largest]; A[largest] = tmp; // A[i] を子供と入れ替える HEAPIFYH, largest); } } 6

HEAPIFYA,) 6 3 4 0 4 5 6 7 4 7 9 3 8 9 0 8 HEAPIFYA,4) 6 3 4 0 4 5 6 7 4 7 9 3 8 9 0 8 HEAPIFYA,9) 6 3 4 0 4 5 6 7 8 7 9 3 8 9 0 4 7

HEAPIFYH,i) を行うと 正当性の証明 A[i] を根とする部分木がヒープなら何もしない ヒープでなければ A[i], 左の子, 右の子の中で左の子が最大とする 左の子と A[i] を入れ替える 右の子の親は値が大きくなっているので, 右の子ではヒープ条件を満たす A[i] は部分木中の最大値を格納 左の子はヒープ条件を満たしていない可能性があるので, つ下に降りて繰り返す log 回で終了 8

HEAPIFY の実行時間 節点 i を根とする, サイズ の部分木に対する HEAPIFY の実行時間 T) 部分木のサイズは /3 以下 T) T/3) + ) T) = Olg ) 高さ h の節点での実行時間は Oh) /3 8 7 4 /3 /3 9

ヒープの構成 HEAPIFY では左右の部分木がヒープである必要がある 全体をヒープにするには, 分木の葉の方からヒープにしていけばいい void BUILD_HEAPHEAP *H, it, data *A, it legth) { it i; H->legth = legth; H->heap_size = ; H->A = A; for i = /; i >= ; i--) { HEAPIFYH,i); } } 30

A 4 3 6 9 0 4 8 7 4 3 4 3 5 6 7 8 9 0 6 9 0 4 8 7 HEAPIFYA,5) 4 3 4 3 5 6 7 8 4 9 0 6 9 0 8 7 HEAPIFYA,3) 4 3 3 4 5 6 7 6 9 0 8 9 0 4 8 7 HEAPIFYA,4) 4 3 0 4 5 6 7 4 6 9 3 8 9 0 8 7 HEAPIFYA,) 3

4 3 6 0 4 5 6 7 4 7 9 3 8 9 0 8 HEAPIFYA,) 6 3 4 0 4 5 6 7 8 7 9 3 8 9 0 4 3

計算量の解析 Olg ) 時間のHEAPIFYが O) 回 O lg ) 時間 注 : これはタイトではない ) 高さ h の節点でのHEAPIFYは Oh) 時間 要素のヒープ内に高さ h の節点は高々 / h+ 個 lg lg h0 h O h) O O h h h 0 x x 0 x) を用いる 33

最大値の削除 EXTRACT_MAXS): 最大のキーを持つ S の要素を削除し, その値を返す data EXTRACT_MAXHEAP *H) // Olg ) 時間 { data MAX, *A; A = H->A; if H->heap_size < ) { pritf"error ヒープのアンダーフロー "); exit); } MAX = A[]; A[] = A[H->heap_size]; // ヒープの最後の値を根に移動する H->heap_size = H->heap_size - ; HEAPIFYH,); // ヒープを作り直す retur MAX; } 34

削除前 正当性の証明 根には最大値が入っている 根も, 左右の子もヒープになっている 削除後 最後の要素が根に入っている 根はヒープ条件を満たしていない可能性がある 根の左右の子はヒープになっている 根でHEAPIFYを行えば全体がヒープになる 35

ヒープソート まずヒープを作る すると最大要素が A[] に入る A[] と A[] を交換すると, 最大要素が A[] に入る ヒープのサイズを つ減らしてヒープを維持する void HEAPSORTit, data *A) { it i; data tmp; HEAP H; BUILD_HEAP&H,,A,); for i = ; i >= ; i--) { tmp = A[]; A[] = A[i]; A[i] = tmp; // 根と最後の要素を交換 H.heap_size = H.heap_size - ; HEAPIFY&H,); } } 36

6 3 4 0 4 5 6 7 8 7 9 3 8 9 0 4 0 3 8 9 4 5 6 7 4 7 3 8 4 6 4 3 8 0 4 5 6 7 4 7 9 3 8 9 6 9 3 8 3 4 5 6 7 4 7 0 4 6 37

8 3 4 7 5 6 3 7 3 4 4 5 3 4 9 8 9 0 4 6 0 4 6 4 4 3 3 3 3 7 8 9 4 7 8 9 0 4 6 0 4 6 38

3 3 4 7 8 9 4 7 8 9 0 4 6 0 4 6 A 3 4 7 8 9 0 4 6 39

計算量 BUILD_HEAP: O) 時間 HEAPIFY: O lg ) 時間 全体で O lg ) 時間 40

要素の挿入 void INSERTHEAP *H, data ey) // Olg ) 時間 { it i; data *A; A = H->A; H->heap_size = H->heap_size + ; if H->heap_size > H->legth) { pritf"error ヒープのオーバーフロー "); exit); } i = H->heap_size; while i > && A[PARENTi)] < ey) { A[i] = A[PARENTi)]; i = PARENTi); } A[i] = ey; } 4

正当性の証明 新しい要素を配列の最後 A[] に置く A[PARENTi)] A[] なら条件を満たす そうでなければ A[] と親を交換する つまり, 根から A[] の親までのパス上の要素は大きい順に並んでいるので, A[] を挿入すべき場所を探索してそこに挿入する パス上の値は大きくなるだけなので, ヒープ条件は必ず満たしている 4

要素の削除 削除したい値がヒープ中のどこに格納されているか分かっているとする void DELETEHEAP *H, it i) // Olg ) 時間 { data *A; A = H->A; if i < i > H->heap_size) { pritf"error 範囲エラー %d,%d) ",i,h->heap_size); exit); } while i > ) { A[i] = A[PARENTi)]; // A[i] の祖先を つずつ下におろす i = PARENTi); } A[] = A[H->heap_size]; // 根が空になるので, 最後の値を根に持っていく H->heap_size = H->heap_size - ; HEAPIFYH,); } 43

正当性の証明 A[i] を削除するとき, A[i] から根までのパス上の値を つずつ下ろす 値は大きくなるだけなのでヒープ条件は満たす 根の値が無くなるので, ヒープの最後の値を移動 根がヒープ条件を満たさなくなるので HEAPIFY を行う 注意 : 削除したい値がヒープ中のどこにあるかは分からないときは, 探索に O) 時間かかる 44

ヒープに格納する値が から の整数で, 重複は無いとする 整数の配列 I[..] を用意する I[x] = j のとき, 整数 x がヒープの A[j] に格納されていることを表す I[x] = - ならば x は格納されていないとする 要素の移動を行うときは同時に I も更新する A[j] = x I[x] = j が常に成り立つ ように更新 ) 45

プライオリティキュー 要素の集合 S を保持するためのデータ構造 各要素はキーと呼ばれる値を持つ 次の操作をサポートする INSERTS,x): S に要素 x を追加する MAXIMUMS): 最大のキーを持つ S の要素を返す EXTRACT_MAXS): 最大のキーを持つ S の要素を削除し, その値を返す 46

ソーティングの下界 ソーティングの入力 : a, a,..., a 比較ソートでは要素間の比較のみを用いてソートを行う つの要素 a i, a j が与えられたとき, それらの相対的な順序を決定するためにテストを行う a i a j, a i a j, a i a j, a i a j, a i a j のみ これ以外の方法では要素のテストはできない 47

仮定 すべての入力要素は異なると仮定する a i a j という比較は行わないと仮定できる a i a j, a i a j, a i a j, a i a j は全て等価 全ての比較は a i a j という形と仮定できる 48

決定木モデル 比較ソートは決定木 decisio tree) とみなせる 決定木はソーティングアルゴリズムで実行される比較を表現している アルゴリズム中における制御, データの移動などの要因は無視する 49

5,4,3,4, 入力 : 数の列各ノードでは a i a j の比較を行う,4, a : a 5,4,3 a : a 3 a : a 3,4, 5,4,3 a, a, a 3 a : a 3 a, a, a 3 a : a 3 a, a 3, a a 3, a, a a, a 3, a a 3, a, a 葉は入力の置換に対応,,4 3,4,5 50

決定木の高さと比較回数 決定木はソートアルゴリズム A から決まる 入力数列を与えると決定木の対応する葉が決まる 根から葉までのパスの長さ =A を実行する際の比較回数 根から葉までのパス長の最大値 = 実行されるソートアルゴリズムの最悪比較回数 比較ソートでの最悪の比較回数は決定木の高さに対応 5

最悪時の下界 決定木の高さの下界 = 任意の比較ソートアルゴリズムの実行時間の下界 定理 要素をソートするどんな決定木の高さも lg ) 証明 要素をソートする高さ h の決定木を考える. ソートを正しく行うには, 要素の! 通りの置換全てが葉に現れなければならない. 高さ h の 分木の葉の数は高々 h. よって! h ではソートできない. つまり h lg!) 5

53 ) lg lg lg lg! Stirlig!) lg e e h e h の公式より e!

系 ヒープソートとマージソートは漸近的に 最適な比較ソートである 証明これらの実行時間の上界 O lg ) は 定理 の最悪時の下界 lg ) と一致する. 54