21
離離離離離離離離 離離 (sorting) 離離離離離離

離散システム特論

Embed Size (px)

DESCRIPTION

離散システム特論. 整列 (sorting) アルゴリズム 2. 参考文献. 大森克史・木村春彦・広瀬貞樹 著 「アルゴリズムの基礎」 共立出版 (1997) 渡邊敏正 著 「データ構造と基本アルゴリズム」 共立出版 (2000). 全順序集合 S が与えられたとき, S のすべての要素をその全順序に従って並べ替えること. 簡単のため, n個 の整数の集合を S とし,通常の数字の大小関係で小さい数から大きい数へ並べ替えるとする(昇順ソート  ascending sort) .. 整列とは. 選択法 (selection sort) - PowerPoint PPT Presentation

Citation preview

Page 1: 離散システム特論

離散システム特論

整列 (sorting) アルゴリズム 2

Page 2: 離散システム特論

参考文献

1. 大森克史・木村春彦・広瀬貞樹 著 「アルゴリズムの基礎」 共立出版 (1997)

2. 渡邊敏正 著 「データ構造と基本アルゴリズム」 共立出版 (2000)

Page 3: 離散システム特論

整列とは 全順序集合 S が与えられたとき, S の

すべての要素をその全順序に従って並べ替えること.

簡単のため,n個の整数の集合を S とし,通常の数字の大小関係で小さい数から大きい数へ並べ替えるとする(昇順ソート  ascending sort) .

Page 4: 離散システム特論

ソーティングアルゴリズム

選択法 (selection sort)   バブルソート (bubble sort) 挿入法 (insertion sort) クイックソート (quick sort)

ヒープソート  (heap sort) マージソート (merge sort)

O(n2)

O(n log n)

バケットソート  (bucket sort) 基数ソート (radix sort)

ソーティングアルゴリズムの限界

Page 5: 離散システム特論

マージソート ( merge sort)

入力を2つに分割して,分割した各々を整列した後に,それらを統合する.分割した部分の整列にも再びマージソートを用いる.つまり,再帰的にソートが行われる.

divide-and -conquer method

Page 6: 離散システム特論

マージソートの擬似コードs=1, t=n;

mergesort(s, t){ // s から t の要素をソート

   if (s ≠ t){

   A1 = mergesort(s, (s+t)/2);

  //s から半分までをソートして A1 にしまう

A2 = mergesort( (s+t)/2+1, t);  

// 半分から t までをソートして A2 にしまう.

   merge (A1, A2);   //A1 と A2 をあわせる

}

}

Page 7: 離散システム特論

マージソートの例(4,10,5,2,1,7,9,3,8,6)

分割 (4,10,5,2,1)(7,9,3,8,6)

分割 ((4,10,5)(2,1))((7,9,3)(8,6))

分割 (((4,10)(5))((2)(1)))(((7,9)(3))((8)(6)))

分割((((4)(10))(5))((2)(1)))((((7)(9))(3))((8)(6)))

統治(((4,10)(5))((2)(1)))(((7,9)(3))((8)(6)))

統治((4,5,10)(1,2))((3,7,9)(6,8))

統治(1,2,4,5,10)(3,6,7,8,9)

Page 8: 離散システム特論

マージソートの例(統治)

(1,2,4,5,10)    (3,6,7,8,9)

1 2 3 4 5 6 7 8 9 10

Page 9: 離散システム特論

マージソートの計算量T(n):マージソートの計算量

T(n) 2T(n/2)+n (n2)

1 (n=1)

統治

より

T(n) 2T(n/2)+n

2{2T(n/22)+n/2}+n = 22T(n/22) + 2n

22 {2T(n/23)+n/22} +2n = 23T(n/23) + 3n

… 2kT(n/2k) + kn (k = log n)

よって, T(n) = n+n log n =O(n log n)

Page 10: 離散システム特論

ソーティングアルゴリズムの下限

2つの要素の大小比較が基本操作のアルゴリズム

 → アルゴリズムの判断の分岐数は2

計算のいかなる進行もまとめて,決定木 (decision tree )で表せる.

各頂点は,それまでの計算によって獲得された状態.

2要素の比較がその状態から出る2本の枝

葉がソートされた状態

Page 11: 離散システム特論

決定木{a, b, c} のソート

abc, acb, bac,bca, cab, cba

abcacbcab

bacbcacba

yes noa<b

abcacb

caba<c

yes no

abc acbb<cyes no

bac bcacba

a<cyes no

bca cba

yes nob<c

その時点で考え得る状

2要素の比較はどれでもよい.名付けをかえればよい

ので.

ソートされた状態

Page 12: 離散システム特論

決定木の深さの下限

葉はすべてのソートされた状態に対応 ...総数は n!

最悪の場合(運の悪い問題例)では,決定木の深さ分の比較が必要.

葉の数が n! の決定木(2分木)の深さは最低でもどのくらいか?

abc, acb, bac,bca, cab, cba

abcacbcab

bacbcacba

yes noa<b

abcacb

caba<c

yes no

abc acbb<cyes no

bac bcacba

a<cyes no

bca cbayes nob<c

Page 13: 離散システム特論

決定木の深さの下限(2)

• 深さ d の2分木の葉の数は,高々 2d

•   2d n!  を満たす最小の d をみつければよい.

Stirlingの公式:

N! ≒  √ 2πn nn e-nより, d n log n≒

ソーティングアルゴリズムは O(nlog n) より早くならない.(ヒープソートは最適.)

一般的にアルゴリズムの下限を示すのは大変.

バケットソート,基数ソートは比較以上の情報がある.

Page 14: 離散システム特論

クイックソート (quick sort)

1つの要素 a を基準とし, a よりも小さい要素をa の左に a よりも大きい要素を a の右に分割する.分割した部分の整列も再帰的にソートを行う.

マージソートと同じで分割統治法.ただし,

◆分割は等分ではない

◆統治の操作は必要ない

Page 15: 離散システム特論

基準値による分割の擬似コードa1 から an-1 を an を基準値にして分割. a0 は十分小さな値が入っていると仮定 left :=1, right:=n-1;

while(left<right) {

while (aright > an){right:=right-1;

}

while (aleft < an){left:=left+1;

}

swap (aleft, aright);}

swap (aleft, an);

Page 16: 離散システム特論

クイックソートの例 (1)(4,10,5,2,1,7,9,3,8,6)

基準値left right

(4,10,5,2,1,7,9,3,8,6)基準値

left right

(4,10,5,2,1,7,9,3,8,6)基準値

left right

(4, 3 ,5,2,1,7,9, 10 ,8,6)基準値

left right

Page 17: 離散システム特論

クイックソートの例 (2)

(4, 3 ,5,2,1,7,9, 10 ,8,6)基準値

leftright

(4, 3, 5, 2, 1) (9, 10, 8, 7)

(4, 3 ,5,2,1, 6 ,9, 10 ,8, 7 )

あとはよろしく

Page 18: 離散システム特論

クイックソートの計算量

基準値をソートする部分の最小値が常に選ばれてしまうと,選択法と変わらない.

最悪時間計算量は O(n2)

平均時間計算量は O(n log n)

Page 19: 離散システム特論

クイックソートの平均時間計算量

T(n):n個のデータをクイックソートする平均時間

T(n) = T(m1)+T(m2)+n-1,

ただし, m1+m2=n-1

(m1, m2):(0, n-1), (1, n-2), …, (n-1, 0)

が等確率におこるとすると,

T(n) =1

nT(i) + T(n −1− i)( )

i= 0

n−1

∑ + n −1

Page 20: 離散システム特論

クイックソートの平均計算量(2)

T(n) =1

nT(i) + T(n −1− i)( )

i= 0

n−1

∑ + n −1

=2

nT(i)

i= 0

n−1

∑ + n −1

n(T(n) − 2)= n(n +1) + 2 (T(i) − 2)i= 0

n−1

S(n)=T(n)-2 とおくと,

nS(n) = n(n+1)+2(S(0)+S(1)+…+S(n-1))

(n-1)S(n-1) = (n-1)n +2(S(0)+S(1)+…+S(n-2))

引き算すると,

nS(n) = (n+1)S(n-1)+2n

s(n)

n +1=S(n −1)

n+

2

n +1

=S(n − 2)

n −1+

2

n+

2

n +1

...... =S(1)

2+

2

3+L +

2

n +1

= 2(1+1

2+

1

3+L +

1

n +1− 2)

(Q S(1) = T(1) − 2 = −2)

よって,

S(n) 2(n+1)Hn+1 =O(nlog n)

Page 21: 離散システム特論

レポート課題

① 講義で取り上げなかったソーティングアルゴリズムについて調べ,計算量の算定もせよ.

② 講義で扱ったソーティングアルゴリズムを3つ選び,それを自分でプログラムし,様々な入力に対する実行時間の比較をせよ.

③ 2004年2月期大学院入試問題計算機科学 II(整列の問題)を解け.

http://www.sk.tsukuba.ac.jp/SSE/admission/pastexams.htmlより入手