28
アアアアアアアアアアアアアアアア アアアアアアアアアアアアアアアア アアアアアアアアア アアアアアアアアア tniky1 http://www.tniky1.com 2010 年 CS 年年年

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

  • Upload
    jela

  • View
    81

  • Download
    1

Embed Size (px)

DESCRIPTION

2010 年 CS 勉強会. アルゴリズムイントロダクション第2章 主にソートに関して. tniky1 http://www.tniky1.com. 本章の目的. 「アルゴリズムの設計と解析ってどうやるの??」って人が大まかな流れ、やり方をつかむ。 簡単なソートでまずはやり方を覚えようってこと. 第2章の内容. 今回は実行時間に違いが現れるこの二つ。. ソートアルゴリズム 挿入ソート マージソート アルゴリズムの正当性 ループ不変式 アルゴリズムの実行時間 Θ 記法. 挿入ソート. (まあ、いまさらだろうけど。。) 左から順に挿入しながらソートしていく. - PowerPoint PPT Presentation

Citation preview

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

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

nn-1n-1

n-1tj というのは挿入する場所を探す回数 ( ループ毎 に異なる )

2 5 4 6 1 31 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

nn-1n-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 11 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 2A 3 6

n1 n2

rp q

1 2 2 3 4 2A 3 6

k

rp 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 2A 3 6

k

rp

最小要素最小要素

ソートされて入っている

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 2A 3 6

k

rp

最小要素最小要素

ソートされて入っている

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 2A 3 6

k

rp

最小要素最小要素

ソートされて入っている

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