View
3.651
Download
33
Category
Preview:
DESCRIPTION
アルゴリズムイントロダクション 第2章の勉強会資料 下記でPPT版,KEY版も配布してます. http://tniky1.com/study/
Citation preview
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 3 1 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
n n-1 n-1
n-1 tj というのは挿入する場所を探す回数 (ループ毎 に異なる)
2 5 4 6 1 3 1 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
n n-1 n-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 1 1 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 2 A 3 6
n1 n2
r p q
1 2 2 3 4 2 A 3 6
k
r p 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 2 A 3 6
k
r p
最小要素 最小要素
ソートされて入っている
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 2 A 3 6
k
r p
最小要素 最小要素
ソートされて入っている
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 2 A 3 6
k
r p
最小要素 最小要素
ソートされて入っている
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
Recommended