30
アルゴリズムイントロダクション 第8章 (8.1-8.2) 線形時間ソーティング tniky1 http://www.tniky1.com 201178日金曜日

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

  • Upload
    tniky1

  • View
    1.498

  • Download
    0

Embed Size (px)

DESCRIPTION

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

Citation preview

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

アルゴリズムイントロダクション第8章(8.1-8.2)線形時間ソーティング

tniky1

http://www.tniky1.com

2011年7月8日金曜日

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

8章の概要これまでのソート(比較ソート)では最短でΩ(nlgn)

疑問:これより早いソートはないのか?

線形時間O(n)

残念!

まあ、確かに^^;

結論:無い

証明入力条件に規則があれば可能

2011年7月8日金曜日

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

8.1 ソーティングの下界

これまでの比較ソートの最悪時計算量はΩ(nlgn)であることを証明

8.2 計数ソート

入力条件:入力要素の値の範囲が分かっている

8.3 基数ソート

入力条件:桁数が分かっている

8.4 バケツソート

入力条件:区間[0..1]に一様かつ独立に分布

第8章トピック

2 1 3 0 2 3 0 3

329 457 657 839 436

.78 .17 .39 .26 .72 .94 .21 .12

O(n)

僕の範囲

2011年7月8日金曜日

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

8章の概要これまでのソート (比較ソート) では最短でΩ(nlgn)

線形時間O(n)

結論:無い

証明入力条件に規則があれば可能

疑問:これより早いソートはないのか?

2011年7月8日金曜日

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

ソーティングの下界「比較ソートでは最悪時に必ずΩ(nlgn)の比較が必要」であることを証明

方針 比較ソートは実行される比較を全2分木で表現可能

(最悪時の比較回数) = (木の深さh)

葉数は n! 以上

全2分木の葉数は高々2

166 Chapter 8 Sorting in Linear Time

! >

! >

1:2

2:3 1:3

"1,2,3# 1:3 "2,1,3# 2:3

"1,3,2# "3,1,2# "3,2,1#

! >

! >

! >

"2,3,1#

Figure 8.1 The decision tree for insertion sort operating on three elements. An internal node an-notated by i : j indicates a comparison between ai and a j . A leaf annotated by the permutation!!(1), !(2), . . . , !(n)" indicates the ordering a!(1) # a!(2) # · · · # a!(n). The shaded path indi-cates the decisions made when sorting the input sequence !a1 = 6, a2 = 8, a3 = 5"; the permutation!3, 1, 2" at the leaf indicates that the sorted ordering is a3 = 5 # a1 = 6 # a2 = 8. There are 3! = 6possible permutations of the input elements, so the decision tree must have at least 6 leaves.

they yield identical information about the relative order of ai and a j . We thereforeassume that all comparisons have the form ai # a j .

The decision-tree model

Comparison sorts can be viewed abstractly in terms of decision trees. A decisiontree is a full binary tree that represents the comparisons between elements thatare performed by a particular sorting algorithm operating on an input of a givensize. Control, data movement, and all other aspects of the algorithm are ignored.Figure 8.1 shows the decision tree corresponding to the insertion sort algorithmfrom Section 2.1 operating on an input sequence of three elements.

In a decision tree, each internal node is annotated by i : j for some i and j in therange 1 # i, j # n, where n is the number of elements in the input sequence. Eachleaf is annotated by a permutation !!(1), !(2), . . . , !(n)". (See Section C.1 forbackground on permutations.) The execution of the sorting algorithm correspondsto tracing a path from the root of the decision tree to a leaf. At each internalnode, a comparison ai # a j is made. The left subtree then dictates subsequentcomparisons for ai # a j , and the right subtree dictates subsequent comparisonsfor ai > a j . When we come to a leaf, the sorting algorithm has established theordering a!(1) # a!(2) # · · · # a!(n). Because any correct sorting algorithmmust be able to produce each permutation of its input, a necessary condition fora comparison sort to be correct is that each of the n! permutations on n elementsmust appear as one of the leaves of the decision tree, and that each of these leavesmust be reachable from the root by a path corresponding to an actual execution ofthe comparison sort. (We shall refer to such leaves as “reachable.”) Thus, we shallconsider only decision trees in which each permutation appears as a reachable leaf.

二つの要素の比較の集まりだから

h

比較ソートに対して、最悪時の比較回数をnで一般化できる。これがΩ(nlgn)だと証明完了!

a1 : a2

<a1,a2> <a2,a1>

≤ >

2011年7月8日金曜日

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

決定木:実行される比較を全2分木で表現

・葉に到達した時に順序が確定する。・入力のすべての置換を生成可能:葉数n!

挿入ソートに対する決定木

>>

> >

>a1 : a2

a2 : a3

a1 : a3

a1 : a3

a2 : a3

<a1,a2,a3>

<a3,a2,a1>

<a2,a1,a3>

<a2,a3,a1><a3,a1,a2><a1,a3,a2>

<6, 8, 5>

<6, 8, 5>

<6, 8, 5>

<6, 8, 5>

2011年7月8日金曜日

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

ソーティングの下界

高さhの決定木の葉数は高々 2 (2分木だから)

2 ≥ n!

h ≥ lg(n!)

h ≥ lg(n/e)

h

葉数:n!

n個の要素から構成される n! の置換

h

Stiringの公式 n! > (n/e)

= n lg(n) - n lg(e)

= Ω(n lgn)

比較ソートでは最悪時に必ずΩ(nlgn)の比較が必要

h

2011年7月8日金曜日

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

8章の概要これまでのソート (比較ソート) では最短でΩ(nlgn)

線形時間O(n)

結論:無い

証明入力条件に規則があれば可能

疑問:これより早いソートはないのか?

2011年7月8日金曜日

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

2 2 4 7 7 8

計数ソート(Counting Sort)

入力条件:入力要素の値が整数で範囲が分かっている

2 5 3 0 2 3 0 3

2 0 2 3 0 1

A入力

C補助用

Bソート結果

C’補助用

1 2 3 4 5 6 7 8

0 1 2 3 4 5

0 1 2 3 4 5

n個の各入力要素が 0~k(5) の範囲の整数0~k(5)がそれぞれ入力に何回出現するか(0~kの各値以下の入力が何回出現するか)=(0~kの各値の正しい格納位置)

AとC’からソートしていく。各要素の比較はしていない。

1 2 3 4 5 6 7 8

スライドショーのアニメーションでみてください!!2011年7月8日金曜日

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

2 2 4 7 7 8

計数ソート(Counting Sort)

入力条件:入力要素の値が整数で範囲が分かっている

2 5 3 0 2 3 0 3

2 0 2 3 0 1

A入力

C補助用

Bソート結果

C’補助用

1 2 3 4 5 6 7 8

0 1 2 3 4 5

0 1 2 3 4 5

3

n個の各入力要素が 0~k(5) の範囲の整数0~k(5)がそれぞれ入力に何回出現するか(0~kの各値以下の入力が何回出現するか)=(0~kの各値の正しい格納位置)

AとC’からソートしていく。各要素の比較はしていない。

1 2 3 4 5 6 7 8

スライドショーのアニメーションでみてください!!2011年7月8日金曜日

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

2 2 4 7 7 8

計数ソート(Counting Sort)

入力条件:入力要素の値が整数で範囲が分かっている

2 5 3 0 2 3 0 3

2 0 2 3 0 1

A入力

C補助用

Bソート結果

C’補助用

1 2 3 4 5 6 7 8

0 1 2 3 4 5

0 1 2 3 4 5

3

n個の各入力要素が 0~k(5) の範囲の整数0~k(5)がそれぞれ入力に何回出現するか(0~kの各値以下の入力が何回出現するか)=(0~kの各値の正しい格納位置)

AとC’からソートしていく。各要素の比較はしていない。

1 2 3 4 5 6 7 8

6

スライドショーのアニメーションでみてください!!2011年7月8日金曜日

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

2 2 4 7 7 8

計数ソート(Counting Sort)

入力条件:入力要素の値が整数で範囲が分かっている

2 5 3 0 2 3 0 3

2 0 2 3 0 1

A入力

C補助用

Bソート結果

C’補助用

1 2 3 4 5 6 7 8

0 1 2 3 4 5

0 1 2 3 4 5

0 3

n個の各入力要素が 0~k(5) の範囲の整数0~k(5)がそれぞれ入力に何回出現するか(0~kの各値以下の入力が何回出現するか)=(0~kの各値の正しい格納位置)

AとC’からソートしていく。各要素の比較はしていない。

1 2 3 4 5 6 7 8

6

スライドショーのアニメーションでみてください!!2011年7月8日金曜日

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

2 2 4 7 7 8

計数ソート(Counting Sort)

入力条件:入力要素の値が整数で範囲が分かっている

2 5 3 0 2 3 0 3

2 0 2 3 0 1

A入力

C補助用

Bソート結果

C’補助用

1 2 3 4 5 6 7 8

0 1 2 3 4 5

0 1 2 3 4 5

0 3

n個の各入力要素が 0~k(5) の範囲の整数0~k(5)がそれぞれ入力に何回出現するか(0~kの各値以下の入力が何回出現するか)=(0~kの各値の正しい格納位置)

AとC’からソートしていく。各要素の比較はしていない。

1 2 3 4 5 6 7 8

61

スライドショーのアニメーションでみてください!!2011年7月8日金曜日

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

2 2 4 7 7 8

計数ソート(Counting Sort)

入力条件:入力要素の値が整数で範囲が分かっている

2 5 3 0 2 3 0 3

2 0 2 3 0 1

A入力

C補助用

Bソート結果

C’補助用

1 2 3 4 5 6 7 8

0 1 2 3 4 5

0 1 2 3 4 5

0 3 3

n個の各入力要素が 0~k(5) の範囲の整数0~k(5)がそれぞれ入力に何回出現するか(0~kの各値以下の入力が何回出現するか)=(0~kの各値の正しい格納位置)

AとC’からソートしていく。各要素の比較はしていない。

1 2 3 4 5 6 7 8

61

スライドショーのアニメーションでみてください!!2011年7月8日金曜日

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

2 2 4 7 7 8

計数ソート(Counting Sort)

入力条件:入力要素の値が整数で範囲が分かっている

2 5 3 0 2 3 0 3

2 0 2 3 0 1

A入力

C補助用

Bソート結果

C’補助用

1 2 3 4 5 6 7 8

0 1 2 3 4 5

0 1 2 3 4 5

0 3 3

n個の各入力要素が 0~k(5) の範囲の整数0~k(5)がそれぞれ入力に何回出現するか(0~kの各値以下の入力が何回出現するか)=(0~kの各値の正しい格納位置)

AとC’からソートしていく。各要素の比較はしていない。

1 2 3 4 5 6 7 8

61 5

スライドショーのアニメーションでみてください!!2011年7月8日金曜日

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

2 2 4 7 7 8

計数ソート(Counting Sort)

入力条件:入力要素の値が整数で範囲が分かっている

2 5 3 0 2 3 0 3

2 0 2 3 0 1

A入力

C補助用

Bソート結果

C’補助用

1 2 3 4 5 6 7 8

0 1 2 3 4 5

0 1 2 3 4 5

0 0 2 2 3 3 3 5

n個の各入力要素が 0~k(5) の範囲の整数0~k(5)がそれぞれ入力に何回出現するか(0~kの各値以下の入力が何回出現するか)=(0~kの各値の正しい格納位置)

AとC’からソートしていく。各要素の比較はしていない。

1 2 3 4 5 6 7 8

61 50 2 2 4 7 7

スライドショーのアニメーションでみてください!!2011年7月8日金曜日

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

2 2 4 7 7 8

計数ソート(Counting Sort)

入力条件:入力要素の値が整数で範囲が分かっている

2 5 3 0 2 3 0 3

2 0 2 3 0 1

A入力

C補助用

Bソート結果

C’補助用

1 2 3 4 5 6 7 8

0 1 2 3 4 5

0 1 2 3 4 5

0 0 2 2 3 3 3 5

n個の各入力要素が 0~k(5) の範囲の整数0~k(5)がそれぞれ入力に何回出現するか(0~kの各値以下の入力が何回出現するか)=(0~kの各値の正しい格納位置)

AとC’からソートしていく。各要素の比較はしていない。

1 2 3 4 5 6 7 8

61 50 2 2 4 7 72 2 4 7 7 8

スライドショーのアニメーションでみてください!!2011年7月8日金曜日

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

計数ソート(Counting Sort) アルゴリズム

2 5 3 0 2 3 0 3

2 0 2 3 0 1

A入力

C各出現回数

Bソート結果

2 2 4 7 7 8C’

格納位置

1 2 3 4 5 6 7 8

0 1 2 3 4 5(k)

0 1 2 3 4 5

0 0 2 2 3 3 3 5

i

j

1 2 3 4 5 6 7 8

 for i ← 0 to k  do C[i] ← 0  for j ← 1 to length[A]  do C[A[j]] ← C[A[j]] + 1 for i ← 1 to k  do C[i] ← C[i] + C[i-1] for j ← length[A] downto 1  do B[C[A[j]]] ← A[j]   C[A[j]] ← C[A[j]] - 1

Counting Sort (A, B, k)

j

2011年7月8日金曜日

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

計数ソート(Counting Sort) 計算量

 for i ← 0 to k  do C[i] ← 0  for j ← 1 to length[A]  do C[A[j]] ← C[A[j]] + 1 for i ← 1 to k  do C[i] ← C[i] + C[i-1] for j ← length[A] downto 1  do B[C[A[j]]] ← A[j]   C[A[j]] ← C[A[j]] - 1

Counting Sort (A, B, k)

O(k)

O(n)

O(k)

O(n)

O(n)全体

k=O(n)の時に計数ソートを用いる

2011年7月8日金曜日

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

2 2 4 7 7 8

計数ソート(Counting Sort) 安定性計算量の次に大事な安定性を確認

2 5 3 0 2 3 0 3

2 0 2 3 0 1

A入力

C補助用

Bソート結果

C’補助用

1 2 3 4 5 6 7 8

0 1 2 3 4 5

0 1 2 3 4 5

計数ソートは安定ソート!(この後の基数ソートにて重要)

1 2 3 4 5 6 7 8

2011年7月8日金曜日

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

2 2 4 7 7 8

計数ソート(Counting Sort) 安定性計算量の次に大事な安定性を確認

2 5 3 0 2 3 0 3

2 0 2 3 0 1

A入力

C補助用

Bソート結果

C’補助用

1 2 3 4 5 6 7 8

0 1 2 3 4 5

0 1 2 3 4 5

計数ソートは安定ソート!(この後の基数ソートにて重要)

1 2 3 4 5 6 7 8

2011年7月8日金曜日

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

2 2 4 7 7 8

計数ソート(Counting Sort) 安定性計算量の次に大事な安定性を確認

2 5 3 0 2 3 0 3

2 0 2 3 0 1

A入力

C補助用

Bソート結果

C’補助用

1 2 3 4 5 6 7 8

0 1 2 3 4 5

0 1 2 3 4 5

3

6

計数ソートは安定ソート!(この後の基数ソートにて重要)

1 2 3 4 5 6 7 8

2011年7月8日金曜日

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

2 2 4 7 7 8

計数ソート(Counting Sort) 安定性計算量の次に大事な安定性を確認

2 5 3 0 2 3 0 3

2 0 2 3 0 1

A入力

C補助用

Bソート結果

C’補助用

1 2 3 4 5 6 7 8

0 1 2 3 4 5

0 1 2 3 4 5

0 3

61

計数ソートは安定ソート!(この後の基数ソートにて重要)

1 2 3 4 5 6 7 8

2011年7月8日金曜日

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

2 2 4 7 7 8

計数ソート(Counting Sort) 安定性計算量の次に大事な安定性を確認

2 5 3 0 2 3 0 3

2 0 2 3 0 1

A入力

C補助用

Bソート結果

C’補助用

1 2 3 4 5 6 7 8

0 1 2 3 4 5

0 1 2 3 4 5

0 3 3

61 5

計数ソートは安定ソート!(この後の基数ソートにて重要)

1 2 3 4 5 6 7 8

2011年7月8日金曜日

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

2 2 4 7 7 8

計数ソート(Counting Sort) 安定性計算量の次に大事な安定性を確認

2 5 3 0 2 3 0 3

2 0 2 3 0 1

A入力

C補助用

Bソート結果

C’補助用

1 2 3 4 5 6 7 8

0 1 2 3 4 5

0 1 2 3 4 5

0 0 2 2 3 3 3 5

61 50 0 2 4 7 7

計数ソートは安定ソート!(この後の基数ソートにて重要)

1 2 3 4 5 6 7 8

2011年7月8日金曜日

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

2 2 4 7 7 8

計数ソート(Counting Sort) 安定性計算量の次に大事な安定性を確認

2 5 3 0 2 3 0 3

2 0 2 3 0 1

A入力

C補助用

Bソート結果

C’補助用

1 2 3 4 5 6 7 8

0 1 2 3 4 5

0 1 2 3 4 5

0 0 2 2 3 3 3 5

61 50 0 2 4 7 72 2 4 7 7 8

計数ソートは安定ソート!(この後の基数ソートにて重要)

1 2 3 4 5 6 7 8

2011年7月8日金曜日

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

計数ソート(Counting Sort) まとめ入力条件

入力要素の値が整数で範囲が分かっている

計算量

O(n)

安定性

安定ソート

2011年7月8日金曜日

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

これまで

あ、ソートしないと。

まあ、もちろんクイックソートだよね。

(聖☆おにいさんより)

2011年7月8日金曜日

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

これから

あ、ソートしないと。

入力はどんなのかな?

この場合なら、(計数ソート/基数ソート使えば)O(n)でいけるね!

(聖☆おにいさんより)

2011年7月8日金曜日

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

Thank you

2011年7月8日金曜日