1 / 37

コンピュータ基礎演習  ー探索、整列ー

コンピュータ基礎演習  ー探索、整列ー. 岩井 儀雄 iwai@sys.es.osaka-u.ac.jp. 線形探索と二分探索. 線形探索法 (linear search) データを最初から順番に探索する 例) {2, 4, 5, 8, 9, 11, 6, 7, 15, 20} から 15 を探す  最初の要素から始めて9回目→計算量 O(n) 二分探索法 (binary search) データをあらかじめソートしておき,中央の要素から検索する.. 二分探索 (binary search).

paxton
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. コンピュータ基礎演習 ー探索、整列ー 岩井 儀雄 iwai@sys.es.osaka-u.ac.jp

  2. 線形探索と二分探索 • 線形探索法(linear search) • データを最初から順番に探索する 例){2, 4, 5, 8, 9, 11, 6, 7, 15, 20} から15を探す  最初の要素から始めて9回目→計算量O(n) • 二分探索法(binary search) • データをあらかじめソートしておき,中央の要素から検索する.

  3. 二分探索(binary search) • {2, 4, 5, 6, 7, 8, 9, 11, 15, 20} から15を探す 1回目 {2, 4, 5, 6, 7, 8, 9, 11, 15, 20}

  4. 二分探索(binary search) • {2, 4, 5, 6, 7, 8, 9, 11, 15, 20} から15を探す 2回目 {2, 4, 5, 6, 7, 8, 9, 11, 15, 20}

  5. 二分探索(binary search) • {2, 4, 5, 6, 7, 8, 9, 11, 15, 20} から15を探す 3回目 {2, 4, 5, 6, 7, 8, 9, 11, 15, 20} 探索回数 3回 計算量  log2(n) O(log n)

  6. 整列(sort) • 内部整列(internal sort) • 主記憶上で行う整列 • 外部整列(external sort) • 外部記憶装置(テープ等)上で行う 整列アルゴリズムの優劣→比較回数と交換回数の大小

  7. 安定な整列(stable sort) • 同じ値を持つデータ間の順序関係が整列の前後で保たれている 例)整列前: 7 9 5A 4 8 5B 2   整列後: 2 4 5A 5B 7 8 9 (安定)   整列後: 2 4 5B 5A 7 8 9 (不安定)

  8. 単純な整列(バブルソート) • 配列の後ろから先頭に向かって走査し,もし隣り合う二つの要素の大小関係が逆であったら入れ替える 整列前 20 6 55 74 3 45 13 87 46 30 1回目 比較

  9. 単純な整列(バブルソート) • 配列の後ろから先頭に向かって走査し,もし隣り合う二つの要素の大小関係が逆であったら入れ替える 1回目 20 6 55 74 3 45 13 87 30 46 入替

  10. 単純な整列(バブルソート) • 配列の後ろから先頭に向かって走査し,もし隣り合う二つの要素の大小関係が逆であったら入れ替える 1回目 20 6 55 74 3 45 13 87 30 46 比較

  11. 単純な整列(バブルソート) • 配列の後ろから先頭に向かって走査し,もし隣り合う二つの要素の大小関係が逆であったら入れ替える 1回目 20 6 55 74 3 45 13 30 87 46 入替

  12. 単純な整列(バブルソート) • 配列の後ろから先頭に向かって走査し,もし隣り合う二つの要素の大小関係が逆であったら入れ替える 1回目 20 6 55 74 3 45 13 30 87 46 比較

  13. 単純な整列(バブルソート) • 配列の後ろから先頭に向かって走査し,もし隣り合う二つの要素の大小関係が逆であったら入れ替える 1回目 20 6 55 74 3 45 13 30 87 46 比較

  14. 単純な整列(バブルソート) • 配列の後ろから先頭に向かって走査し,もし隣り合う二つの要素の大小関係が逆であったら入れ替える 1回目 20 6 55 74 3 13 45 30 87 46 入替

  15. 単純な整列(バブルソート) • 配列の後ろから先頭に向かって走査し,もし隣り合う二つの要素の大小関係が逆であったら入れ替える 1回目 20 6 55 74 3 13 45 30 87 46 比較

  16. 単純な整列(バブルソート) • 配列の後ろから先頭に向かって走査し,もし隣り合う二つの要素の大小関係が逆であったら入れ替える 1回目 20 6 55 74 3 13 45 30 87 46 20 6 55 3 74 13 45 30 87 46 20 6 3 55 74 13 45 30 87 46 20 3 6 55 74 13 45 30 87 46 3 20 6 55 74 13 45 30 87 46

  17. 単純な整列(バブルソート) • 配列の後ろから先頭に向かって走査し,もし隣り合う二つの要素の大小関係が逆であったら入れ替える 2回目 3 20 6 55 74 13 45 30 87 46 46 87 30 46 30 45 13 30 13 74 13 55 6 13 6 20

  18. 単純な整列(バブルソート) • 配列の後ろから先頭に向かって走査し,もし隣り合う二つの要素の大小関係が逆であったら入れ替える 2回目 36 20 13 55 74 30 45 46 87 3回目 3 6 13 20 30 55 74 45 46 87 4回目 3 6 13 20 30 45 55 74 46 87 5回目 3 6 13 20 30 45 46 55 74 87 6回目 3 6 13 20 30 45 46 55 74 87 7回目 3 6 13 20 30 45 46 55 74 87 8回目 3 6 13 20 30 45 46 55 74 87 9回目 3 6 13 20 30 45 46 5574 87

  19. バブルソート(疑似コード) for (i←0..n-1) for (j←n-1..i) if !(a[j-1] ≦ a[j]) swap(a[j-1],a[j]) 右辺値の交換 整列アルゴリズムが満たす事後条件 計算量は O(n2)

  20. バブルソート(C言語) for (i←0..n-1) for (j←n-1..i) if !(a[j-1] ≦ a[j]) swap(a[j-1],a[j]) void bubble_sort(int a[],int n) { int I,j,t; for (int I=0; I<n-1; ++I) for (int j=n-1; j>I; --j) if (a[j-1] > a[j]) { t = a[j]; a[j] = a[j-1]; a[j-1] = t; } } swap(a[j-1],a[j])に相当する

  21. 単純な整列(選択ソート) • 未整列部分から最小の要素を選び出し,それを未整列部分の先頭と入れ替える 未整列部分 整列済 未整列部分から最小値を取り出し 続けると下記の条件を満たす 整列アルゴリズムが満たす事後条件

  22. 選択ソート 整列前 20 6 55 74 3 45 13 87 46 30 1回目 入替

  23. 選択ソート 整列前 20 6 55 74 3 45 13 87 46 30 1回目 3 6 55 74 20 45 13 87 46 30

  24. 選択ソート 整列前 20 6 55 74 3 45 13 87 46 30 1回目 3 6 55 74 20 45 13 87 46 30 2回目 3 6 55 74 20 45 13 87 46 30 入替

  25. 選択ソート 整列前 20 6 55 74 3 45 13 87 46 30 1回目 3 6 55 74 20 45 13 87 46 30 2回目 3 6 55 74 20 45 13 87 46 30 3回目  3 613 74 20 45 55 87 46 30 4回目  3 613 20 74 45 55 87 46 30 5回目  3 613 2030 45 55 87 46 74 6回目  3 613 2030 45 55 87 46 74 7回目  3 613 2030 45 46 87 55 74 8回目  3 613 2030 45 46 55 87 74 9回目  3 613 2030 45 46 55 74 87

  26. 選択ソート(疑似コード) for (i←0..n-2) lowest←argmin(a[j]) i<j<n swap(a[i],a[lowest])

  27. 選択ソート(C言語) void selection_sort(int a[],int n) { int i,j,t,lowest,lowval; for (i = 0; i<n-1; ++i) { lowest = i; lowval = a[i]; for (j = i+1; j < n; ++j) if (a[j] < lowval) { lowval = a[j]; lowest = j; } t = a[I]; a[I] = a[lowest]; a[lowest] = t; } } argminの計算部分

  28. 選択ソートの計算量 • ループ n 回,argmin の計算量 O(n) • 選択ソートの計算量は O(n2)

  29. 単純な整列(挿入ソート) • 配列の一部分が整列済みの時に,残りの要素を一つずつ整列済みの中に挿入する 整列前 20 6 55 74 3 45 13 87 46 30 1回目  6 20 55 74 3 45 13 87 46 30 2回目 6 2055 74 3 45 13 87 46 30 3回目  6 205574 3 45 13 87 46 30 4回目  3 6 20 55 74 45 13 87 46 30 5回目  3 6 20 45 55 74 13 87 46 30 6回目  3 6 13 20 45 55 74 87 46 30 7回目  3 6 13 20 45 55 74 87 46 30 8回目  3 6 13 20 45 46 55 74 87 30 9回目  3 6 13 20 30 45 46 55 74 87

  30. 挿入ソート(疑似コード) for (i←0..n-1) j←i while (! (a[j-1] ≦ a[j]) ) swap( a[j-1], a[j] ) j←j-1 計算量:外側ループ O(n) 内側ループ O(n) 合計: O(n2)

  31. コンピュータ基礎演習 ー計算量ー 岩井 儀雄 iwai@sys.es.osaka-u.ac.jp

  32. 計算量(complexity) • 時間計算量(time complexity) • アルゴリズムがデータに対してどれくらい時間がかかるかを示す • 空間計算量(space complexity) • アルゴリズムがデータに対してどれくらい記憶領域を必要とするかを示す • 時間計算量と空間計算量はトレードオフの関係にあることが多い • 計算機にとって記憶資源は潤沢にあるので,通常時間計算量の方が重きを置かれることが多い

  33. オーダー記法O • 計算量T(n)の上界値を評価するとき,O(f(n))という記法を用い,オーダーf(n) と読む. ある正定数cとn0が存在して,n0以上のnに対して, 常に T(n) ≦cf(n) が成立するという意味 n0の役割は有限個の例外を許すことにある.

  34. オーダー記法Ω • 計算量の下界値のオーダーを表すには,記法Ωを用いる.T(n)=Ω(f(n))とは,

  35. 計算量とオーダ表記の関係 計算量の上界O 計算量 実際の計算量 有限個の 例外はOK 計算量の下界Ω n n0

  36. オーダーの演算 例)

  37. 最悪計算量と平均計算量 • 同じアルゴリズムでも入力するデータに応じて計算量が変化する.そこで,客観的に測定し評価する必要がある. • 最悪計算量 worst case complexity • 全ての入力パターンに対して最大の計算量を要するものに基づいて定める • 平均計算量 average complexity • 全ての入力パターンとその入力の生起確率に基づいて計算量の平均を求める

More Related