素朴なアルゴリズム、決定木

素朴なアルゴリズム
講義の内容
• 素朴な(工夫の無い)アルゴリズム
– 単純挿入法
– 単純選択法
– バブルソート
O(n2)
• やや工夫されたアルゴリズム
– マージソート
– ヒープソート
– クイックソート
O(nlogn)
クイックソートの最悪計算量はO(n2)
• O(n2) ⇒ O(nlogn) ⇒?
O(n)
単純挿入法
この部分までを、ソートされている状態にしたい
この部分までは既にソートされている
…
0
1
2
3
4
5
6
単純挿入法
現時点で5番目のデータを適切な位置に移動する
適切な位置に移動したいデータを配列0にコピーする
(番兵と呼ばれる技法を使う)
…
0
1
2
3
4
5
6
単純挿入法
適切な位置に移動したいデータとその左隣のデータを比べて
もし左隣のデータの方が大きい場合はその2つを入れ替える
…
0
1
2
3
4
5
6
単純挿入法
…
0
1
2
3
4
5
6
単純挿入法
…
0
1
2
3
4
5
6
単純挿入法(番兵の役割)
番兵を使わないと余計な比較が必要となる
while (j > 0) and (x < a[j]) do
…
0
1
2
3
4
5
6
単純選択法
小さい順で4番目までを、
ソートされている状態にしたい
小さい順で3番目までは
既にソートされている
…
1
2
3
4
5
6
7
単純選択法
残りのデータの中で一番小さいデータを
見つけて4番目のデータを入れ替える
1
2
3
4
5
6
7
バブルソート
a[1]
a[2]
a[3]
a[4]
a[5]
a[6]
a[7]
a[8]
22
3
3
3
3
3
3
17
22
6
6
6
6
6
6
17
22
9
9
9
9
21
6
17
22
17
17
17
47
21
9
17
22
21
21
9
47
21
21
21
22
22
3
9
47
33
33
33
33
33
33
33
47
47
47
47
決定木とは
• ソートの計算過程を木で表したもの
• 計算過程 ⇒ データの比較の過程
• ソートアルゴリズム ⇔ 決定木
Yes
a<b
b<c
Yes
Yes
a<b<c
Yes
No
a<b
a<c
No
Yes
No
a<c
a<b
No
a<c<b c<a<b
Yes
No
b<c
No
Yes
No
b<a<c b<c<a c<b<a
ソートアルゴリズムと決定木
比較
c
勝者
b
1位
a < b < cの場合
敗者
2位
比較
比較
敗者
a
Yes
3位
a<b
b<c
Yes
Yes
a<b<c
Yes
No
a<b
a<c
No
Yes
No
a<c
a<b
No
a<c<b c<a<b
Yes
No
b<c
No
Yes
No
b<a<c b<c<a c<b<a
ソートアルゴリズムと決定木
比較
c
勝者
b
1位
a < c < bの場合
敗者
2位
比較
比較
敗者
a
Yes
3位
a<b
b<c
Yes
Yes
a<b<c
Yes
No
a<b
a<c
No
Yes
No
a<c
a<b
No
a<c<b c<a<b
Yes
No
b<c
No
Yes
No
b<a<c b<c<a c<b<a
ソートアルゴリズムと決定木
•
•
•
•
ソートアルゴリズム
ソートの時間計算
決定木の葉
決定木の高さ
Yes
⇔
⇔
⇔
⇔
決定木
比較回数
ソートの結果
比較回数
1回 a < b
2回 b < c
Yes
Yes
a<b<c
Yes
No
3回 a < b
a<c
No
Yes
No
a<c
a<b
No
a<c<b c<a<b
Yes
No
b<c
No
Yes
No
b<a<c b<c<a c<b<a
ソートアルゴリズムの下界
定理
• ソートアルゴリズム
⇔
決定木
n!個の葉を持つどんな決定木Tでも,
• ソートの時間計算
⇔n) 比較回数
決定木Tの高さはΩ(n log
• 決定木の葉
⇔
ソートの結果
• 決定木の高さ
⇔
最悪比較回数
• 示したい事
n個のデータを持つどんなソートアルゴリズムでも,
最悪比較回数がΩ(n log n)かかる
• 決定木の言葉に翻訳すると
n!個の葉を持つどんな決定木Tでも,
決定木Tの高さはΩ(n log n)
ソートアルゴリズムの下界
定理
n!個の葉を持つどんな決定木Tでも,
決定木Tの高さはΩ(n log n)
証明の概略
– n個のデータがなすソート結果の組合せ数 ⇒ n!個
– 決定木Tの高さをhで表す (このhを見積もりたい)
– 高さhの木の葉の個数は高々2h (補題4.1)
⇒ 2h ≧ (葉の個数) = n!
⇒ 2h ≧ n! = (n) × (n-1)×・・・×(n/2) ×・・・×(2)×(1)
≧ (n/2)× (n/2)×・・・×(n/2) = (n/2)n/2
⇒ h = log 2h ≧ log(n/2)n/2 ≒ n/2 log n/2 = Ω(n log n)
ここからは部品
バブルソート
1
2
3
4
5
6
7
バブルソート
1
2
3
4
5
6
7
バブルソート
1
2
3
4
5
6
7
ソートアルゴリズムと決定木
比較
c
勝者
b
1位
b < a < cの場合
敗者
2位
比較
比較
敗者
a
Yes
3位
a<b
b<c
Yes
Yes
a<b<c
Yes
No
a<b
a<c
No
Yes
No
a<c
a<b
No
a<c<b c<a<b
Yes
No
b<c
No
Yes
No
b<a<c b<c<a c<b<a
決定木
比較
c
b
勝者
敗者
比較
2位
比較
敗者
a
Yes
Yes
1位
b<c
3位
a<b
No
No
Yes
a<c
No
a < b < c Yes a < c No b < a < c Yes b < c No
a<c<b
c<a<b
b<c<a
c<b<a