1 / 14

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

アルゴリズムとデータ構造. 2010 年 7 月 15 日 酒居敬一 ( sakai.keiichi@kochi-tech.ac.jp ) 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.

cynara
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. アルゴリズムとデータ構造 2010年7月15日 酒居敬一(sakai.keiichi@kochi-tech.ac.jp) http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/ALG/2010/index.html

  2. > > > > < > > > > < > < > < > < 10 10 10 15 15 10 10 15 15 32 15 32 32 32 15 8 8 12 32 12 15 24 15 10 24 6 5 8 3 5 3 1 6 1 3 8 入れ替え 入れ替え 入れ替え 入れ替え 入れ替え 入れ替え 入れ替え 入れ替え 入れ替え 入れ替え 入れ替え 入れ替え 1 15 12 15 残りも同様に整列させると… 5 15 入れ替えない 入れ替えない 入れ替えない 入れ替えない 入れ替えない 24 6 8 10 32 6 15 12 32 24 32 3 10 10 8 3 15 5 32 12 1 6 24 5 10 1 32 1 3 5 6 8 10 12 15 24 32 バブルソート 整列済み

  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; } } } } 配列要素どおしの入れ替えが無くなれば終了

  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, 10 18, 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]$

  5. 基準値を決定 基準値を決定 基準値を決定 基準値を決定 基準値を決定 基準値を決定 基準値を決定 8 3 5 1 6 < 10 < 15 32 12 24 10 8 3 15 5 32 12 1 6 24 整列済み 10 3 1 < 5 < 8 6 10 12 < 15 < 32 24 1 < 3 5 6 < 8 10 12 15 24 < 32 1 3 5 6 8 10 12 15 24 32 クイックソート

  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); } }

  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個のデータの中央値をとる。

  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; } }

  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;

  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つ移動 基準値がどちらにも含まれない場合 単純に入れ替え

  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); } } [sakai@star 11]$ java QuickSortTest 47, 18, 8, 7, 2, 4, 9, 0, 72, 88, 2, 5, 9, 10 Pivot = 10 9, 5, 8, 7, 2, 4, 9, 0, 2, 10, 88, 72, 18, 47 Pivot = 9 2, 5, 8, 7, 2, 4, 9, 0, 9, 10, 88, 72, 18, 47 Pivot = 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, 47 Pivot = 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, 47 Pivot = 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]$

  12. マージソート(198ページ) 手続きf(p) • 問題pを半分にするそれぞれの部分問題に対して次の処理 • 部分問題の要素数が2個 • 小さい順に並び替える→次の処理へ • 部分問題の要素数が1個 • 並び替える必要が無い→次の処理へ • 部分問題の要素数が2個より多い • 手続きfを部分問題を引数に呼ぶ • 半分にした問題をマージする • 部分問題列の先頭から、小さい順に取り出す

  13. 53 12 41 69 11 2 84 28 31 63 97 58 76 19 91 88 69 97 53 69 11 84 84 63 97 76 91 91 97 12 41 84 2 28 28 31 58 19 88 88 53 63 69 41 11 58 91 76 12 53 2 31 88 19 41 76 28 63 12 58 31 11 2 19 2 11 12 19 28 31 41 53 58 63 69 76 84 88 91 97

  14. マージソート(逐次処理, 201ページ) • データの分割にかかる時間(2要素に分解)n/2 • ソートにかかる時間(段数log2n, データ数n)n log2n • ステップ数は n/2 + n log2nつまり O(n logn) •   クイックソートと並ぶオーダーで処理ができる

More Related