28
tniky1 http://www.tniky1.com 2010CS勉強会

アルゴリズムイントロダクション 第2章

  • Upload
    tniky1

  • View
    3.651

  • Download
    33

Embed Size (px)

DESCRIPTION

アルゴリズムイントロダクション 第2章の勉強会資料 下記でPPT版,KEY版も配布してます. http://tniky1.com/study/

Citation preview

Page 1: アルゴリズムイントロダクション 第2章

tniky1

http://www.tniky1.com

2010年CS勉強会

Page 2: アルゴリズムイントロダクション 第2章

2010年CS勉強会:アルゴリズムイントロダクション

Copyright© 2010 tniky1 All rights reserved.

本章の目的

 「アルゴリズムの設計と解析ってどうやるの??」って人が大まかな流れ、やり方をつかむ。

 簡単なソートでまずはやり方を覚えようってこと

Page 2

Page 3: アルゴリズムイントロダクション 第2章

2010年CS勉強会:アルゴリズムイントロダクション

Copyright© 2010 tniky1 All rights reserved.

第2章の内容

 ソートアルゴリズム - 挿入ソート

- マージソート

 アルゴリズムの正当性 - ループ不変式

 アルゴリズムの実行時間

- Θ記法

Page 3

今回は実行時間に違いが現れるこの二つ。

Page 4: アルゴリズムイントロダクション 第2章

2010年CS勉強会:アルゴリズムイントロダクション

Copyright© 2010 tniky1 All rights reserved.

挿入ソート

Page 4

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

Page 5: アルゴリズムイントロダクション 第2章

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

Page 6: アルゴリズムイントロダクション 第2章

2010年CS勉強会:アルゴリズムイントロダクション

Copyright© 2010 tniky1 All rights reserved.

アルゴリズム作成後の手順

Page 6

(1)正当性の検証

(2)実行時間を求める

まずはこっちから

本当にそのアルゴリズムは正しいの? そのアルゴリズムは有益なの?

Page 7: アルゴリズムイントロダクション 第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

ループ中常にソートされている

Page 8: アルゴリズムイントロダクション 第2章

2010年CS勉強会:アルゴリズムイントロダクション

Copyright© 2010 tniky1 All rights reserved.

ループ不変式を用いたアルゴリズム正当性の示し方

 ループ不変式に対して3つの性質を示す - 初期条件

- ループの実行開始直前でループ不変式が真

- ループ内条件 - ループの何回目かの繰り返しの直前でループ不変式が真ならば、次の繰り返しの直前でも真

- 終了条件 - ループが終了した時、アルゴリズムの正当性証明を手助けする有力な情報(今回の場合は配列がソートされていること)が不変式から得られる。

Page 8

この二つが成り立てば すべてのループの繰り 返しでループ不変式が真

終了時に有力な情報が得られないと意味がない

Page 9: アルゴリズムイントロダクション 第2章

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

ループ中常にソートされている

Page 10: アルゴリズムイントロダクション 第2章

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

Page 11: アルゴリズムイントロダクション 第2章

2010年CS勉強会:アルゴリズムイントロダクション

Copyright© 2010 tniky1 All rights reserved.

アルゴリズム作成後の手順

Page 11

(1)正当性の検証

(2)実行時間を求める

次はこっち。。

本当にそのアルゴリズムは正しいの? そのアルゴリズムは有益なの?

Page 12: アルゴリズムイントロダクション 第2章

2010年CS勉強会:アルゴリズムイントロダクション

Copyright© 2010 tniky1 All rights reserved.

アルゴリズムの実行時間を求める

 実行時間には下記のようなものがある - 最悪時の実行時間

- 最良時の実行時間

- 平均実行時間:(確率論が必要で5章で解説)

 通常最悪の場合を考慮すべし! - 最悪になる場合が良くあるから(例えば、DB検索のアルゴリズムで検索結果がDBになかったときとか)

- 最悪の場合を考えておけば、それ以上悪くなることを懸念しなくてすむ

Page 12

Page 13: アルゴリズムイントロダクション 第2章

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

ループ判定は本体より一回多くなる

実行回数

各行の実行回数とその 各実行時間が出れば、 全体の実行時間は求まる!

Page 14: アルゴリズムイントロダクション 第2章

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)

つまり、     が決まれば求めることができる。     は

Page 15: アルゴリズムイントロダクション 第2章

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

最悪の場合逆順で並んでいる

上記の式に代入 重要なのは実行時間の増加率

Page 16: アルゴリズムイントロダクション 第2章

2010年CS勉強会:アルゴリズムイントロダクション

Copyright© 2010 tniky1 All rights reserved.

ソートアルゴリズム

 挿入ソート - 逐次添加法

- 部分列を整列した後、一つの要素を新しい場所に挿入することによってソートされた部分列を得る

 マージソート - 分割統治法

- 問題をいくつかの部分問題に分割し、部分問題を再帰的に解く - 特徴として再帰的なアルゴリズムとなる

Page 16

Page 17: アルゴリズムイントロダクション 第2章

2010年CS勉強会:アルゴリズムイントロダクション

Copyright© 2010 tniky1 All rights reserved.

マージの動作

Page 17

番兵

Page 18: アルゴリズムイントロダクション 第2章

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

Page 19: アルゴリズムイントロダクション 第2章

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

最小要素 最小要素

ソートされて入っている

Page 20: アルゴリズムイントロダクション 第2章

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

最小要素 最小要素

ソートされて入っている

Page 21: アルゴリズムイントロダクション 第2章

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

最小要素 最小要素

ソートされて入っている

Page 22: アルゴリズムイントロダクション 第2章

2010年CS勉強会:アルゴリズムイントロダクション

Copyright© 2010 tniky1 All rights reserved.

マージソート

Page 22

ソート列

初期配列

さっきのMERGEを利用してソート

Page 23: アルゴリズムイントロダクション 第2章

2010年CS勉強会:アルゴリズムイントロダクション

Copyright© 2010 tniky1 All rights reserved.

マージソートの正当性

Page 23

配列 A の添字 p から r までをソートする p r

/* (終了条件) */

A

Page 24: アルゴリズムイントロダクション 第2章

2010年CS勉強会:アルゴリズムイントロダクション

Copyright© 2010 tniky1 All rights reserved.

分割統治アルゴリズムの実行時間

- 問題を a 個の部分問題に分割し、サイズを 1/b にした時

-  If n <= c とは問題サイズが十分に小さい時

-  D(n): 分割にかかる時間 -  C(n): 結合にかかる時間

Page 24

結合 分割 統治

Page 25: アルゴリズムイントロダクション 第2章

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章で行う。ここではもっと直感的に解く方法を行う。

Page 26: アルゴリズムイントロダクション 第2章

2010年CS勉強会:アルゴリズムイントロダクション

Copyright© 2010 tniky1 All rights reserved.

マージソートアルゴリズムの実行時間

Page 26

最上位レベルの実行時間はcn(マージにかかる時間)

Page 27: アルゴリズムイントロダクション 第2章

2010年CS勉強会:アルゴリズムイントロダクション

Copyright© 2010 tniky1 All rights reserved.

マージソートアルゴリズムの実行時間

Page 27

深さがlog2nとなる!

Page 28: アルゴリズムイントロダクション 第2章

2010年CS勉強会:アルゴリズムイントロダクション

Copyright© 2010 tniky1 All rights reserved.

まとめ

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

- 実行時間を求める

Page 28