アルゴリズムイントロダクション第2章 主にソートに関して
description
Transcript of アルゴリズムイントロダクション第2章 主にソートに関して
アルゴリズムイントロダクション第2章アルゴリズムイントロダクション第2章主にソートに関して主にソートに関して
tniky1
http://www.tniky1.com
2010 年 CS 勉強会
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
本章の目的
「アルゴリズムの設計と解析ってどうやるの??」って人が大まかな流れ、やり方をつかむ。
簡単なソートでまずはやり方を覚えようってこと
Page 2
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
第2章の内容
ソートアルゴリズム- 挿入ソート
- マージソート
アルゴリズムの正当性- ループ不変式
アルゴリズムの実行時間- Θ 記法
Page 3
今回は実行時間に違いが現れるこの二つ。
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
挿入ソート
Page 4
(まあ、いまさらだろうけど。。)左から順に挿入しながらソートしていく
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
擬似コード
Page 5
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
2 5 4 6 1 31 2 3 4 5 6 配列 1 から
j
length[A]
i
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
アルゴリズム作成後の手順
Page 6
(1) 正当性の検証
(2) 実行時間を求める
まずはこっちから
本当にそのアルゴリズムは正しいの?そのアルゴリズムは有益なの?
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
挿入ソートの正当性
ループ不変式を用いて正当性を示すループ不変式
- A[1...j-1] に格納されているカードはソートされている→ループ不変式として定式化
Page 7
2 5 4 6 1 3
A[1...j-1]
j
ループ中常にソートされている
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
ループ不変式を用いたアルゴリズム正当性の示し方
ループ不変式に対して3つの性質を示す- 初期条件
- ループの実行開始直前でループ不変式が真
- ループ内条件- ループの何回目かの繰り返しの直前でループ不変式が真ならば、次の繰
り返しの直前でも真
- 終了条件- ループが終了した時、アルゴリズムの正当性証明を手助けする有力な情
報 ( 今回の場合は配列がソートされていること ) が不変式から得られる。
Page 8
この二つが成り立てばすべてのループの繰り返しでループ不変式が真
終了時に有力な情報が得られないと意味がない
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
ループ不変式でアルゴリズムの正当性を示す
Page 9
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] はソートされている )
2 5 4 6 1 3
A[1...j-1]
j
ループ中常にソートされている
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
ループ不変式でアルゴリズムの正当性を示す
Page 10
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] はソートされている !よって配列全体がソートされており、アルゴリズムは正当である
1 2 3 4 5 6
A[1...j-1]=A[1..n]
j=n+1
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
アルゴリズム作成後の手順
Page 11
(1) 正当性の検証
(2) 実行時間を求める
次はこっち。。
本当にそのアルゴリズムは正しいの?そのアルゴリズムは有益なの?
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
アルゴリズムの実行時間を求める
実行時間には下記のようなものがある- 最悪時の実行時間
- 最良時の実行時間
- 平均実行時間: ( 確率論が必要で5章で解説 )
通常最悪の場合を考慮すべし!- 最悪になる場合が良くあるから ( 例えば、 DB 検索のアルゴリズ
ムで検索結果が DB になかったときとか )
- 最悪の場合を考えておけば、それ以上悪くなることを懸念しなくてすむ
Page 12
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
アルゴリズムの実行時間を求める
Page 13
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
nn-1n-1
n-1tj というのは挿入する場所を探す回数 ( ループ毎 に異なる )
2 5 4 6 1 31 2 3 4 5 6
j
n 個
i
ループ判定は本体より一回多くなる
実行回数
各行の実行回数とその各実行時間が出れば、全体の実行時間は求まる!
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
アルゴリズムの実行時間を求める
Page 14
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
nn-1n-1
n-1
実行回数
C1
C2
C3
C4
C5
C6
C7
コスト
実行時間 T(n)
つまり、 が決まれば求めることができる。 は
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
アルゴリズムの実行時間を求める
Page 15
実行時間 T(n)
挿入する場所を探す回数 ( ループ毎 に異なる )
[ 最悪の場合 ]毎回 i=0 までソートされるtj=i
5 6 4 3 2 11 2 3 4 5 6
j
i
最悪の場合逆順で並んでいる
上記の式に代入 重要なのは実行時間の増加率
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
ソートアルゴリズム
挿入ソート- 逐次添加法
- 部分列を整列した後、一つの要素を新しい場所に挿入することによってソートされた部分列を得る
マージソート- 分割統治法
- 問題をいくつかの部分問題に分割し、部分問題を再帰的に解く
- 特徴として再帰的なアルゴリズムとなる
Page 16
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
マージの動作
Page 17
番兵
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
マージの擬似コード
Page 18
2 4 5 7 ∞1 2 3 4 5
i
1 2 3 6 ∞1 2 3 4 5
j
L R
2 4 5 7 1 2A 3 6
n1 n2
rp q
1 2 2 3 4 2A 3 6
k
rp q
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
マージの正当性
ループ不変式- A には、 L と R の要素中で小さい方から k − p 個がソー
トされて入っている
- L[i] と R[j] は、 L と R でまだ A に書き戻さ れていない要素のなかでそれそれ最小要素である
Page 19
2 4 5 7 ∞1 2 3 4 5
i
1 2 3 6 ∞1 2 3 4 5
j
L R
1 2 2 3 4 2A 3 6
k
rp
最小要素最小要素
ソートされて入っている
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
マージの正当性
Page 20
初期条件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] が最小要素になることも成立。逆も同じ
2 4 5 7 ∞1 2 3 4 5
i
1 2 3 6 ∞1 2 3 4 5
j
L R
1 2 2 3 4 2A 3 6
k
rp
最小要素最小要素
ソートされて入っている
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
マージの正当性
Page 21
終了条件k=r+1つまり A[p..k-1]=A[p..r] はソートされている !よって二つの整列した配列からのマージアルゴリズムの正当性は示された
実行時間「 2 つの配列の先頭から小さい方を取る」を n 回 (n1+n2 回 ) 繰り返す : Θ(n)
2 4 5 7 ∞1 2 3 4 5
i
1 2 3 6 ∞1 2 3 4 5
j
L R
1 2 2 3 4 2A 3 6
k
rp
最小要素最小要素
ソートされて入っている
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
マージソート
Page 22
ソート列
初期配列
さっきの MERGE を利用してソート
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
マージソートの正当性
Page 23
配列 A の添字 p から r までをソートする p r
/* ( 終了条件 ) */
A
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
分割統治アルゴリズムの実行時間
- 問題を a 個の部分問題に分割し、サイズを 1/b にした時
- If n <= c とは問題サイズが十分に小さい時
- D(n): 分割にかかる時間
- C(n): 結合にかかる時間
Page 24
結合分割統治
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
マージソートアルゴリズムの実行時間
Page 25
T(n) = aT(n/b) + D(n) + C(n)
T(n) = 2T(n/2) + Θ(1) + Θ(n) if n > 1 =Θ(1) if n = 1
問題を 2 個に分割し、サイズが 1/2 に なるので a = b = 2
Merge には Θ(n) 時間かかる
部分列の中央 を計算するだけなので D(n) = Θ(1)
結合分割統治
これを一般的に解くのは4章で行う。ここではもっと直感的に解く方法を行う。
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
マージソートアルゴリズムの実行時間
Page 26
最上位レベルの実行時間は cn( マージにかかる時間 )
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
マージソートアルゴリズムの実行時間
Page 27
深さが log2n となる!
2010 年 CS 勉強会:アルゴリズムイントロダクション
Copyright© 2010 tniky1 All rights reserved.
まとめ
アルゴリズムを書いた時に下記ができると思えればOK かな?- ループ不変式を使用して正当性を示す
- 実行時間を求める
Page 28