アルゴリズムとデータ構造

14
アアアアアアアアアアアア アアアアアアアアアアアア 2010 2010 7 7 15 15 アアアアアア( ([email protected] ) ) http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/ALG/2010/ index.html

Upload: cynara

Post on 06-Jan-2016

50 views

Category:

Documents


0 download

DESCRIPTION

アルゴリズムとデータ構造. 2010 年 7 月 15 日 酒居敬一 ( [email protected] ) http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/ALG/2010/index.html. >. >. >. >. >. <. >. >. >. >. <. >. <. >. <. >. <. 10. 10. 10. 15. 15. 10. 10. 15. 15. 32. 15. 32. 32. 32. 15. 8. 8. 12. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: アルゴリズムとデータ構造

アルゴリズムとデータ構造アルゴリズムとデータ構造アルゴリズムとデータ構造アルゴリズムとデータ構造

20102010 年年 77 月月 1515 日日

酒居敬一酒居敬一 (([email protected]))

http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/ALG/2010/index.html

Page 2: アルゴリズムとデータ構造

10 18 3 15 5 32 12 6 24

>10 8 <15 32

108

入れ替え

>10 3

入れ替え

<10 15

103

入れ替えない

>15 5

入れ替え

155

入れ替えない

>32 12

入れ替え

3212

>32 1

入れ替え

321

>32 6

入れ替え

326

>32 24

入れ替え

3224 整列済み

>8 3

入れ替え

83

<8 10

入れ替えない

>10 5

入れ替え

105

<10 15

入れ替えない

>15 12

入れ替え

1512

>15 1

入れ替え

151

>15 6

入れ替え

156

<15 24

入れ替えない

24

残りも同様に整列させると…

101 83 155 32126 24

バブルソート

Page 3: アルゴリズムとデータ構造

public final class BubbleSort { public static void sort(int[] anyTargetIntegers) { if(null == anyTargetIntegers){ throw new NullPointerException(); } BubbleSort.print(anyTargetIntegers); boolean isChanged = false; int limit = anyTargetIntegers.length - 1; while(true){ isChanged = false; for(int count = 0; count < limit; count++){ if(anyTargetIntegers[count] > anyTargetIntegers[count+1]){ int temp = anyTargetIntegers[count]; anyTargetIntegers[count] = anyTargetIntegers[count+1]; anyTargetIntegers[count+1] = temp; isChanged = true; } } --limit; BubbleSort.print(anyTargetIntegers); if(!isChanged){ break; } } }}

配列要素どおしの入れ替えが無くなれば終了

Page 4: アルゴリズムとデータ構造

public static void print(int[] anyTargetIntegers) { int limit = anyTargetIntegers.length - 1; for(int count = 0; count < limit; count++){ if(10 > anyTargetIntegers[count]){ System.out.print(" "); } System.out.print(anyTargetIntegers[count] + ", "); } System.out.println(anyTargetIntegers[limit]);}public class BubbleSortTest { public static void main(String[] anyArguments) { int[] intArray = {47, 18, 8, 7, 2, 4, 9, 0, 72, 88, 2, 5, 9, 10}; BubbleSort.sort(intArray); }} [sakai@star 11]$ java BubbleSortTest

47, 18, 8, 7, 2, 4, 9, 0, 72, 88, 2, 5, 9, 1018, 8, 7, 2, 4, 9, 0, 47, 72, 2, 5, 9, 10, 88 8, 7, 2, 4, 9, 0, 18, 47, 2, 5, 9, 10, 72, 88 7, 2, 4, 8, 0, 9, 18, 2, 5, 9, 10, 47, 72, 88 2, 4, 7, 0, 8, 9, 2, 5, 9, 10, 18, 47, 72, 88 2, 4, 0, 7, 8, 2, 5, 9, 9, 10, 18, 47, 72, 88 2, 0, 4, 7, 2, 5, 8, 9, 9, 10, 18, 47, 72, 88 0, 2, 4, 2, 5, 7, 8, 9, 9, 10, 18, 47, 72, 88 0, 2, 2, 4, 5, 7, 8, 9, 9, 10, 18, 47, 72, 88 0, 2, 2, 4, 5, 7, 8, 9, 9, 10, 18, 47, 72, 88[sakai@star 11]$

// テスト用プログラム

Page 5: アルゴリズムとデータ構造

基準値を決定

10 18 3 15 5 32 12 6 24

108 3 5 1 6 15 32 12 24< <10

整列済み

基準値を決定 基準値を決定

5 15<3 1 < 8 6 <12 32 24<10

基準値を決定 基準値を決定 基準値を決定 基準値を決定

5 15<31 < 86 12 3224 <10

101 83 155 32126 24

クイックソート

Page 6: アルゴリズムとデータ構造

public final class QuickSort { public static void print(int[] anyTargetIntegers) { int limit = anyTargetIntegers.length - 1; for(int count = 0; count < limit; count++){ if(10 > anyTargetIntegers[count]){ System.out.print(" "); } System.out.print(anyTargetIntegers[count] + ", "); } System.out.println(anyTargetIntegers[limit]); } public static void sort(int[] anyTargetIntegers) { if(null == anyTargetIntegers){ throw new NullPointerException(); } QuickSort.sort(anyTargetIntegers, 0, anyTargetIntegers.length -1); }}

Page 7: アルゴリズムとデータ構造

private static int getPivot(int[] anyTargetIntegers, int aStart, int anEnd) { int left = anyTargetIntegers[aStart]; int middle = anyTargetIntegers[aStart + ((anEnd - aStart)/2)]; int right = anyTargetIntegers[anEnd]; if((left < middle) && (middle < right)){ return middle; } if((left > middle) && (middle > right)){ return middle; } if((left < right) && (right < middle)){ return right; } if((left > right) && (right > middle)){ return right; } if((right < left) && (left < middle)){ return left; } return left; }

できれば、最大値や最小値を避けたい。そこで、候補として左端・中央・右端を選択し、実際にどれを基準値にするか?このとき、 3 個のデータの並び (6 通り ) を考えて、 3 個のデータの中央値をとる。

Page 8: アルゴリズムとデータ構造

private static void sort(int[] anyTargetIntegers, int aStart, int anEnd) { int range = anEnd - aStart; if(3 > range){

/* 要素数が少ないとき ( 要素数 3 以下)、別の方法でソート */ } int pivot = QuickSort.getPivot(anyTargetIntegers, aStart, anEnd); int temp = 0; int left = aStart; int right = anEnd; while(true){ /* 入れ替える要素を探します */ if(left < right){

/* 要素を入れ替え、基準値に従って分けます */

}else{ break; } } QuickSort.sort(anyTargetIntegers, aStart, left -1); QuickSort.sort(anyTargetIntegers, right +1, anEnd); QuickSort.print(anyTargetIntegers);}

for(; left < right; left++){ if(pivot <= anyTargetIntegers[left]){ break; }}for(; left < right; right--){ if(pivot >= anyTargetIntegers[right]){ break; }}

Page 9: アルゴリズムとデータ構造

if(2 == range){/* 要素数が 3 の場合はバブルソート */

if(anyTargetIntegers[aStart] > anyTargetIntegers[aStart+1]){ int temp = anyTargetIntegers[aStart]; anyTargetIntegers[aStart] = anyTargetIntegers[aStart+1]; anyTargetIntegers[aStart+1] = temp; } if(anyTargetIntegers[aStart+1] > anyTargetIntegers[anEnd]){ int temp = anyTargetIntegers[aStart+1]; anyTargetIntegers[aStart+1] = anyTargetIntegers[anEnd]; anyTargetIntegers[anEnd] = temp; } if(anyTargetIntegers[aStart] > anyTargetIntegers[aStart+1]){ int temp = anyTargetIntegers[aStart]; anyTargetIntegers[aStart] = anyTargetIntegers[aStart+1]; anyTargetIntegers[aStart+1] = temp; } }else if(1 == range){

/* 要素数が 2 の場合は比較して入れ替え */ if(anyTargetIntegers[aStart] > anyTargetIntegers[anEnd]){ int temp = anyTargetIntegers[aStart]; anyTargetIntegers[aStart] = anyTargetIntegers[anEnd]; anyTargetIntegers[anEnd] = temp; } } QuickSort.print(anyTargetIntegers); return;

Page 10: アルゴリズムとデータ構造

if(pivot == anyTargetIntegers[left]){ temp = anyTargetIntegers[left]; anyTargetIntegers[left] = anyTargetIntegers[right]; anyTargetIntegers[right] = anyTargetIntegers[left+1]; anyTargetIntegers[left+1] = temp; left++; }else if(pivot == anyTargetIntegers[right]){ temp = anyTargetIntegers[right]; anyTargetIntegers[right] = anyTargetIntegers[left]; anyTargetIntegers[left] = anyTargetIntegers[right-1]; anyTargetIntegers[right-1] = temp; right--; }else{ temp = anyTargetIntegers[left]; anyTargetIntegers[left] = anyTargetIntegers[right]; anyTargetIntegers[right] = temp; left++; right--; }

基準値が左側に含まれる場合

基準値を右へ1つ移動

基準値がどちらにも含まれない場合

単純に入れ替え

基準値が右側に含まれる場合

基準値を左へ1つ移動

Page 11: アルゴリズムとデータ構造

[sakai@star 11]$ java QuickSortTest 47, 18, 8, 7, 2, 4, 9, 0, 72, 88, 2, 5, 9, 10Pivot = 10 9, 5, 8, 7, 2, 4, 9, 0, 2, 10, 88, 72, 18, 47Pivot = 9 2, 5, 8, 7, 2, 4, 9, 0, 9, 10, 88, 72, 18, 47Pivot = 2 0, 2, 2, 7, 8, 4, 9, 5, 9, 10, 88, 72, 18, 47 0, 2, 2, 7, 8, 4, 9, 5, 9, 10, 88, 72, 18, 47Pivot = 5 0, 2, 2, 4, 5, 8, 9, 7, 9, 10, 88, 72, 18, 47 0, 2, 2, 4, 5, 8, 9, 7, 9, 10, 88, 72, 18, 47 0, 2, 2, 4, 5, 7, 8, 9, 9, 10, 88, 72, 18, 47 0, 2, 2, 4, 5, 7, 8, 9, 9, 10, 88, 72, 18, 47Pivot = 72 0, 2, 2, 4, 5, 7, 8, 9, 9, 10, 47, 18, 72, 88 0, 2, 2, 4, 5, 7, 8, 9, 9, 10, 18, 47, 72, 88 0, 2, 2, 4, 5, 7, 8, 9, 9, 10, 18, 47, 72, 88[sakai@star 11]$

public class QuickSortTest { public static void main(String[] anyArguments) { int[] intArray = {47, 18, 8, 7, 2, 4, 9, 0, 72, 88, 2, 5, 9, 10}; QuickSort.sort(intArray); }}

Page 12: アルゴリズムとデータ構造

マージソート (198 ページ )

手続き f(p)• 問題 p を半分にする

それぞれの部分問題に対して次の処理– 部分問題の要素数が 2 個

• 小さい順に並び替える→次の処理へ

– 部分問題の要素数が 1 個• 並び替える必要が無い→次の処理へ

– 部分問題の要素数が 2 個より多い• 手続き f を部分問題を引数に呼ぶ

• 半分にした問題をマージする– 部分問題列の先頭から、小さい順に取り出

Page 13: アルゴリズムとデータ構造

41 2 28 31 58 1912 8869 11 84 63 76 9153 97

41 2 28 31 58 1912 88

69 11 84 63 76 9153 97

41

69

11

2

84

28

31

63

58 76

19

91

12

53 88

97

41

69

11

2

84

28

31

63

58

76

19

91

12

53 88

97

412 28 31 581912 886911 8463 76 9153 97

Page 14: アルゴリズムとデータ構造

マージソート( 逐次処理 , 201 ページ )

• データの分割にかかる時間 (2 要素に分解 )   n/2

• ソートにかかる時間 ( 段数 log2n, データ数 n)   n log2n

• ステップ数は n/2 + n log2n つまり O(n logn)

•   クイックソートと並ぶオーダーで処理ができる