アルゴリズムイントロダクション第2章 主にソートに関して

Slides:



Advertisements
Similar presentations
1 高速フーリエ変換 (fast Fourier transform). 2 高速フーリエ変換とは? – 簡単に言うとフーリエ変換を効率よく計算 する方法 – アルゴリズムの設計技法は分割統治法に基 づいている 今回の目的は? – 多項式の積を求める問題を取り上げ、高速 フーリエ変換のアルゴリズムを用いた解法.
Advertisements

4.3 マージソート.
離散システム特論 整列(sorting)アルゴリズム 2.
データ構造とアルゴリズム論 第5章 整列(ソート)のアルゴリズム
4.ソート 4-1.ソート問題について 4-2.簡単なソートアルゴリズム 4-3.高度なソートアルゴリズム
アルゴリズムとデータ構造 2012年6月27日
第12回 ソート(3): シェルソート、クイックソート
第10回 整列 ~ バブルソート,挿入ソート,選択ソート~
第11回 整列 ~ シェルソート,クイックソート ~
データ構造とアルゴリズム論 第5章 整列(ソート)のアルゴリズム
第11回 整列 ~ バケットソート,基数ソート,ヒープソート~
データ構造とアルゴリズム論 第6章 探索のアルゴリズム
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
算法数理工学 第1回 定兼 邦彦.
4-3:高度なソートアルゴリズム① (分割統治法にもとづくソート)
アルゴリズムイントロダクション第5章( ) 確率論的解析
2009/10/9 良いアルゴリズムとは 第2講: 平成21年10月9日 (金) 4限 E252教室 コンピュータアルゴリズム.
4.整列のアルゴリズム.
アルゴリズムとデータ構造 --- 理論編 --- 山本 真基
第10回 ソート(1):単純なソートアルゴリズム
C言語 配列 2016年 吉田研究室.
情報工学概論 (アルゴリズムとデータ構造)
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
アルゴリズムとデータ構造 補足資料7-3 「単純選択ソートselsort.c」
第6章 2重ループ&配列 2重ループと配列をやります.
データ構造とアルゴリズム 分割統治 ~ マージソート~.
岩井 儀雄 コンピュータ基礎演習  ー探索、整列ー 岩井 儀雄
データ構造とアルゴリズム論 第6章 探索のアルゴリズム
プログラミング論 II 電卓,逆ポーランド記法電卓
データ構造と アルゴリズム 第八回 知能情報学部 新田直也.
データ構造とアルゴリズム論 第2章 配列(構造)を使った処理
アルゴリズム入門.
大域的データフロー解析 流れグラフ 開始ブロック 基本ブロックをnodeとし、 基本ブロック間の制御関係をedgeとするグラフを、
データ構造とアルゴリズム論 第7章 探索のアルゴリズム
第11回 整列 ~ シェルソート,クイックソート ~
算法数理工学 第1回 定兼 邦彦.
定兼邦彦 今井浩 東京大学理学系研究科 情報科学専攻
情報工学概論 (アルゴリズムとデータ構造)
ソートアルゴリズムの種類 選択ソート (selection sort) バブルソート (bubble sort)
情報工学概論 (アルゴリズムとデータ構造)
わんくま同盟茶藝部顧問 Microsoft MVP for VC episthmh
データ構造とアルゴリズム論 第6章 整列(ソート)のアルゴリズム
アルゴリズムとデータ構造1 2005年7月1日
大岩 元 慶応大学環境情報学部 再帰 データ構造とプログラミング(8) 大岩 元 慶応大学環境情報学部
アルゴリズムとプログラミング (Algorithms and Programming)
先進的計算基盤システムシンポジウム SACSIS2007併設企画 マルチコアプログラミングコンテスト 「Cellスピードチャレンジ2007」
データ構造とアルゴリズム論 第5章 整列(ソート)のアルゴリズム
プログラミング 4 整列アルゴリズム.
2009/10/23 整列アルゴリズム (1) 第4講: 平成21年10月23日 (金) 4限 E252教室 コンピュータアルゴリズム.
プログラミング 4 探索と計算量.
データ構造とアルゴリズム論 第5章 整列(ソート)のアルゴリズム
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
復習 一定回数を繰り返す反復処理の考え方 「ループ」と呼ぶ false i < 3 true i をループ変数あるいはカウンタと呼ぶ
アルゴリズムとデータ構造1 2006年7月11日
アルゴリズムとデータ構造 2011年6月23日
プログラミング演習Ⅲ- Sorting Quick Sort and Merge Sort
5.サーチ 5-1.線形探索 5-2.2分探索 5-3.ハッシュ.
補講:アルゴリズムと漸近的評価.
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
Data Clustering: A Review
プログラミングⅡ 第2回.
ハフマン符号長の効率的な求め方.
データ構造とアルゴリズム論 第6章 探索のアルゴリズム
アルゴリズムとプログラミング (Algorithms and Programming)
情報工学概論 (アルゴリズムとデータ構造)
ソートのプログラムの流れ 配列の中身を小さい順に並び替える a[1],a[2],…a[n]の値を順に出力する
アルゴリズムとデータ構造 2012年6月25日
参考:大きい要素の処理.
アルゴリズム ~すべてのプログラムの基礎~.
プログラミング論 バイナリーサーチ 1.
Presentation transcript:

アルゴリズムイントロダクション第2章 主にソートに関して 2010年CS勉強会 アルゴリズムイントロダクション第2章 主にソートに関して tniky1 http://www.tniky1.com 12s それでは [マインドマップをベースとした 複数人での情報共有システム ] について発表をはじめます。 発表者は、~です. よろしくお願いします。

本章の目的 「アルゴリズムの設計と解析ってどうやるの??」って人が大まかな流れ、やり方をつかむ。 簡単なソートでまずはやり方を覚えようってこと Page 2

第2章の内容 ソートアルゴリズム アルゴリズムの正当性 アルゴリズムの実行時間 Θ記法 挿入ソート マージソート ループ不変式 今回は実行時間に違いが現れるこの二つ。 ソートアルゴリズム 挿入ソート マージソート アルゴリズムの正当性 ループ不変式 アルゴリズムの実行時間 Θ記法 Page 3

挿入ソート (まあ、いまさらだろうけど。。) 左から順に挿入しながらソートしていく Page 4

擬似コード procedure Insertion-Sort(A) for j ← 2 to length[A] do key ← A[j] 配列1から 1 2 3 4 5 6 2 5 4 6 1 3 i length[A] procedure Insertion-Sort(A)  for j ← 2 to length[A]   do key ← A[j]    i←j−1    while i > 0 and A[i] > key      do A[i+1] ← A[i]      i←i−1    A[i+1] ← key Page 5

アルゴリズム作成後の手順 (1)正当性の検証 (2)実行時間を求める 本当にそのアルゴリズムは正しいの? そのアルゴリズムは有益なの? まずはこっちから (1)正当性の検証 (2)実行時間を求める Page 6

挿入ソートの正当性 ループ不変式を用いて正当性を示す ループ不変式 A[1...j-1]に格納されているカードはソートされている→ループ不変式として定式化 j 2 5 4 6 1 3 A[1...j-1] ループ中常にソートされている Page 7

ループ不変式を用いたアルゴリズム正当性の示し方 ループ不変式に対して3つの性質を示す 初期条件 ループの実行開始直前でループ不変式が真 ループ内条件 ループの何回目かの繰り返しの直前でループ不変式が真ならば、次の繰り返しの直前でも真 終了条件 ループが終了した時、アルゴリズムの正当性証明を手助けする有力な情報(今回の場合は配列がソートされていること)が不変式から得られる。 この二つが成り立てば すべてのループの繰り 返しでループ不変式が真 終了時に有力な情報が得られないと意味がない Page 8

ループ不変式でアルゴリズムの正当性を示す j 2 5 4 6 1 3 A[1...j-1] ループ中常にソートされている  for j ← 2 to length[A]   do key ← A[j]    i←j−1    while i > 0 and A[i] > key      do A[i+1] ← A[i]      i←i−1    A[i+1] ← key 初期条件 J=2 つまりA[1]のみ よってA[1..j-1]はソートされている ループ内条件 A[j]の入れるべき所を探し、見つかるまでA[j-1],A[j-2]...をひとつづつ右にずらし、最後にA[j]を挿入。 各繰り返しでループ不変式が成立(A[1..j-1]はソートされている) Page 9

ループ不変式でアルゴリズムの正当性を示す j=n+1 1 2 3 4 5 6 A[1...j-1]=A[1..n]  for j ← 2 to length[A]   do key ← A[j]    i←j−1    while i > 0 and A[i] > key      do A[i+1] ← A[i]      i←i−1    A[i+1] ← key 終了条件 j=n+1 つまり A[1..j-1]=A[1..n]はソートされている! よって配列全体がソートされており、 アルゴリズムは正当である Page 10

アルゴリズム作成後の手順 (1)正当性の検証 (2)実行時間を求める 本当にそのアルゴリズムは正しいの? そのアルゴリズムは有益なの? 次はこっち。。 (2)実行時間を求める Page 11

アルゴリズムの実行時間を求める 実行時間には下記のようなものがある 通常最悪の場合を考慮すべし! 最悪時の実行時間 最良時の実行時間 平均実行時間:(確率論が必要で5章で解説) 通常最悪の場合を考慮すべし! 最悪になる場合が良くあるから(例えば、DB検索のアルゴリズムで検索結果がDBになかったときとか) 最悪の場合を考えておけば、それ以上悪くなることを懸念しなくてすむ Page 12

アルゴリズムの実行時間を求める for j ← 2 to length[A] do key ← A[j] i←j−1 1 2 3 4 5 6 各行の実行回数とその 各実行時間が出れば、 全体の実行時間は求まる! 2 5 4 6 1 3 i n個 実行回数  for j ← 2 to length[A]   do key ← A[j]    i←j−1    while i > 0 and A[i] > key      do A[i+1] ← A[i]      i←i−1    A[i+1] ← key n n-1 ループ判定は本体より一回多くなる tj というのは挿入する場所を探す回数 (ループ毎 に異なる) Page 13

アルゴリズムの実行時間を求める for j ← 2 to length[A] do key ← A[j] i←j−1 コスト 実行回数  for j ← 2 to length[A]   do key ← A[j]    i←j−1    while i > 0 and A[i] > key      do A[i+1] ← A[i]      i←i−1    A[i+1] ← key C1 C2 C3 C4 C5 C6 C7 n n-1 実行時間T(n) つまり、     が決まれば求めることができる。     は Page 14

アルゴリズムの実行時間を求める tj=i 実行時間T(n) 挿入する場所を探す回数 (ループ毎 に異なる) [最悪の場合]      挿入する場所を探す回数 (ループ毎 に異なる) [最悪の場合] 毎回i=0までソートされる tj=i j 1 2 3 4 5 6 5 6 4 3 2 1 i 最悪の場合逆順で並んでいる 重要なのは実行時間の増加率 上記の式に代入 Page 15

ソートアルゴリズム 挿入ソート マージソート 逐次添加法 分割統治法 部分列を整列した後、一つの要素を新しい場所に挿入することによってソートされた部分列を得る マージソート 分割統治法 問題をいくつかの部分問題に分割し、部分問題を再帰的に解く 特徴として再帰的なアルゴリズムとなる Page 16

マージの動作 番兵 Page 17

マージの擬似コード A 2 4 5 7 1 2 3 6 p q r i j L 2 4 5 7 ∞ R 1 2 3 6 ∞ n1 n2 k 1 2 3 4 5 1 2 3 4 5 L 2 4 5 7 ∞ R 1 2 3 6 ∞ n1 n2 k A 1 2 2 3 4 2 3 6 p q r Page 18

マージの正当性 ループ不変式 Aには、L と R の要素中で小さい方から k − p 個がソートされて入っている L[i] と R[j] は、L と R でまだ A に書き戻さ れていない要素のなかでそれぞれ最小要素である i j 1 2 3 4 5 1 2 3 4 5 L 2 4 5 7 ∞ R 1 2 3 6 ∞ 最小要素 最小要素 k A 1 2 2 3 4 2 3 6 p r ソートされて入っている Page 19

マージの正当性 i j L 2 4 5 7 ∞ R 1 2 3 6 ∞ 最小要素 最小要素 k A 1 2 2 3 4 2 3 6 p r 1 2 3 4 5 1 2 3 4 5 L 2 4 5 7 ∞ R 1 2 3 6 ∞ 最小要素 最小要素 k A 1 2 2 3 4 2 3 6 p r ソートされて入っている 初期条件 k=p つまりA[p..k-1]は空 i=j=1であるのでL,Rは最小の配列要素。よってループ不変式は真 ループ内条件 L[i]<=R[j]と仮定 L[i]がAに戻されていない要素で最小。 L[i]をA[k]にコピーした後にもソートは成り立つ。iとkが1づつインクリメントされるのでL[i],R[j]が最小要素になることも成立。逆も同じ Page 20

マージの正当性 i j L 2 4 5 7 ∞ R 1 2 3 6 ∞ 最小要素 最小要素 k A 1 2 2 3 4 2 3 6 p r 1 2 3 4 5 1 2 3 4 5 L 2 4 5 7 ∞ R 1 2 3 6 ∞ 最小要素 最小要素 k A 1 2 2 3 4 2 3 6 p r ソートされて入っている 終了条件 k=r+1 つまりA[p..k-1]=A[p..r]はソートされている! よって二つの整列した配列からのマージアルゴリズムの正当性は示された 実行時間 「2 つの配列の先頭から小さい方を取る」を n回(n1+n2回)繰り返す: Θ(n) Page 21

マージソート さっきのMERGEを利用してソート ソート列 初期配列 Page 22

マージソートの正当性 配列 A の添字 p から r までをソートする p r A /* (終了条件) */ Page 23

分割統治アルゴリズムの実行時間 問題を a 個の部分問題に分割し、サイズを 1/b にした時 If n <= c とは問題サイズが十分に小さい時 D(n): 分割にかかる時間 C(n): 結合にかかる時間 統治 分割 結合 Page 24

マージソートアルゴリズムの実行時間 T(n) = aT(n/b) + D(n) + C(n) 統治 分割 結合 T(n) = aT(n/b) + D(n) + C(n) 問題を 2 個に分割し、 サイズが 1/2 に なるの で a = b = 2 Merge には Θ(n) 時間かかる 部分列の中央 を計算する だけなので D(n) = Θ(1) T(n) = 2T(n/2) + Θ(1) + Θ(n)    if n > 1 =Θ(1)                if n = 1 これを一般的に解くのは4章で行う。ここではもっと直感的に解く方法を行う。 Page 25

マージソートアルゴリズムの実行時間 最上位レベルの実行時間はcn(マージにかかる時間) Page 26

マージソートアルゴリズムの実行時間 深さがlog2nとなる! Page 27

まとめ アルゴリズムを書いた時に下記ができると思えればOKかな? ループ不変式を使用して正当性を示す 実行時間を求める Page 28