37
ココココココココココ コココ コココ ココ ココ [email protected]

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

  • Upload
    paxton

  • View
    28

  • Download
    1

Embed Size (px)

DESCRIPTION

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

Citation preview

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

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

岩井 儀雄[email protected]

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

線形探索と二分探索 線形探索法 (linear search)

データを最初から順番に探索する例) {2, 4, 5, 8, 9, 11, 6, 7, 15, 20} から 15 を探す 最初の要素から始めて9回目→計算量 O(n)

二分探索法 (binary search) データをあらかじめソートしておき,中央の要素から

検索する.

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

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

{2, 4, 5, 6, 7, 8, 9, 11, 15, 20}1回目

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

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

{2, 4, 5, 6, 7, 8, 9, 11, 15, 20}2回目

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

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

{2, 4, 5, 6, 7, 8, 9, 11, 15, 20}

探索回数 3回計算量   log2(n) O(log n)

3回目

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

整列 (sort) 内部整列 (internal sort)

主記憶上で行う整列 外部整列 (external sort)

外部記憶装置(テープ等)上で行う

整列アルゴリズムの優劣→比較回数と交換回数の大小

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

安定な整列 (stable sort) 同じ値を持つデータ間の順序関係が整

列の前後で保たれている

例)整列前: 7 9 5A 4 8 5B 2  整列後: 2 4 5A 5B 7 8 9  (安定)  整列後: 2 4 5B 5A 7 8 9  (不安定)

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

単純な整列(バブルソート) 配列の後ろから先頭に向かって走査し,もし隣り合う二つ

の要素の大小関係が逆であったら入れ替える

整列前  20 6 55 74 3 45 13 87 46 301回目

比較

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

単純な整列(バブルソート) 配列の後ろから先頭に向かって走査し,もし隣り合う二つ

の要素の大小関係が逆であったら入れ替える

1回目  20 6 55 74 3 45 13 87 30 46

入替

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

単純な整列(バブルソート) 配列の後ろから先頭に向かって走査し,もし隣り合う二つ

の要素の大小関係が逆であったら入れ替える

1回目  20 6 55 74 3 45 13 87 30 46

比較

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

単純な整列(バブルソート) 配列の後ろから先頭に向かって走査し,もし隣り合う二つ

の要素の大小関係が逆であったら入れ替える

1回目  20 6 55 74 3 45 13 30 87 46

入替

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

単純な整列(バブルソート) 配列の後ろから先頭に向かって走査し,もし隣り合う二つ

の要素の大小関係が逆であったら入れ替える

1回目  20 6 55 74 3 45 13 30 87 46

比較

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

単純な整列(バブルソート) 配列の後ろから先頭に向かって走査し,もし隣り合う二つ

の要素の大小関係が逆であったら入れ替える

1回目  20 6 55 74 3 45 13 30 87 46

比較

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

単純な整列(バブルソート) 配列の後ろから先頭に向かって走査し,もし隣り合う二つ

の要素の大小関係が逆であったら入れ替える

1回目  20 6 55 74 3 13 45 30 87 46

入替

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

単純な整列(バブルソート) 配列の後ろから先頭に向かって走査し,もし隣り合う二つ

の要素の大小関係が逆であったら入れ替える

1回目  20 6 55 74 3 13 45 30 87 46

比較

Page 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

Page 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

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

単純な整列(バブルソート) 配列の後ろから先頭に向かって走査し,もし隣り合う二つ

の要素の大小関係が逆であったら入れ替える

2回目  3 6 20 13 55 74 30 45 46 873回目 3 6 13 20 30 55 74 45 46 874回目 3 6 13 20 30 45 55 74 46 875回目 3 6 13 20 30 45 46 55 74 876回目 3 6 13 20 30 45 46 55 74 877回目 3 6 13 20 30 45 46 55 74 878回目  3 6 13 20 30 45 46 55 74 879回目  3 6 13 20 30 45 46 55 74 87

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

バブルソート(疑似コード)

for (i←0..n-1) for (j←n-1..i) if !(a[j-1] ≦ a[j]) swap(a[j-1],a[j])

整列アルゴリズムが満たす事後条件 ∀i, j[i < j] ⇒ a[i] ≤a[ j]

計算量は O(n2)

右辺値の交換

Page 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]) に相当する

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

単純な整列(選択ソート) 未整列部分から最小の要素を選び出し,それを未整

列部分の先頭と入れ替える

整列アルゴリズムが満たす事後条件 ∀i, j[i < j] ⇒ a[i] ≤a[ j]

a[0] ≤ a[1] ≤ ≤ a[i –1] ≤ a[i] ≤ a[n –1]整列済 未整列部分

未整列部分から最小値を取り出し続けると下記の条件を満たす

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

選択ソート

整列前  20 6 55 74 3 45 13 87 46 301回目

入替

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

選択ソート

整列前  20 6 55 74 3 45 13 87 46 301回目 3 6 55 74 20 45 13 87 46 30

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

選択ソート

整列前  20 6 55 74 3 45 13 87 46 301回目 3 6 55 74 20 45 13 87 46 302回目 3 6 55 74 20 45 13 87 46 30

入替

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

選択ソート

整列前  20 6 55 74 3 45 13 87 46 301回目 3 6 55 74 20 45 13 87 46 302回目 3 6 55 74 20 45 13 87 46 303回目  3 6 13 74 20 45 55 87 46 304回目  3 6 13 20 74 45 55 87 46 305回目  3 6 13 20 30 45 55 87 46 746回目  3 6 13 20 30 45 55 87 46 747回目  3 6 13 20 30 45 46 87 55 748回目  3 6 13 20 30 45 46 55 87 749回目  3 6 13 20 30 45 46 55 74 87

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

選択ソート(疑似コード)

for (i←0..n-2) lowest←argmin(a[j]) i<j<n swap(a[i],a[lowest])

Page 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 の計算部分

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

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

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

単純な整列(挿入ソート) 配列の一部分が整列済みの時に,残りの要素

を一つずつ整列済みの中に挿入する整列前  20 6 55 74 3 45 13 87 46 301回目  6 20 55 74 3 45 13 87 46 302回目 6 20 55 74 3 45 13 87 46 303回目  6 20 55 74 3 45 13 87 46 304回目  3 6 20 55 74 45 13 87 46 305回目  3 6 20 45 55 74 13 87 46 306回目  3 6 13 20 45 55 74 87 46 307回目  3 6 13 20 45 55 74 87 46 308回目  3 6 13 20 45 46 55 74 87 309回目  3 6 13 20 30 45 46 55 74 87

Page 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)

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

コンピュータ基礎演習 ー計算量ー

岩井 儀雄[email protected]

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

計算量 (complexity) 時間計算量 (time complexity)

アルゴリズムがデータに対してどれくらい時間がかかるかを示す

空間計算量 (space complexity) アルゴリズムがデータに対してどれくらい記憶領域を必要

とするかを示す

時間計算量と空間計算量はトレードオフの関係にあることが多い

計算機にとって記憶資源は潤沢にあるので,通常時間計算量の方が重きを置かれることが多い

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

オーダー記法O 計算量 T(n) の上界値を評価するとき, O(f

(n)) という記法を用い,オーダー f(n) と読む.

ある正定数 c と n0 が存在して, n0以上の n に対して,常に T(n) ≦cf(n) が成立するという意味n0 の役割は有限個の例外を許すことにある.

∃c,n0 c> 0, n≥n0 ⇒ T(n) ≤cf(n)

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

オーダー記法 Ω 計算量の下界値のオーダーを表すには,

記法 Ωを用いる. T(n)=Ω(f(n)) とは,

∃c∀n T(n) ≥cf(n)

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

計算量とオーダ表記の関係

n

計算量

計算量の下界Ω

計算量の上界 O実際の計算量

有限個の例外は OK

n0

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

オーダーの演算 T1 = O( f (n)), T2 = O(g(n))

T1 + T2 = O(max( f (n),g(n)))T1 × T2 = O( f (n) ×g(n))

例) T1 = O(n2), T2 = O(n3)T1 + T2 = O(n3)T1 × T2 = O(n5)

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

最悪計算量と平均計算量 同じアルゴリズムでも入力するデータに応じ

て計算量が変化する.そこで,客観的に測定し評価する必要がある.

最悪計算量 worst case complexity 全ての入力パターンに対して最大の計算量を要す

るものに基づいて定める 平均計算量 average complexity

全ての入力パターンとその入力の生起確率に基づいて計算量の平均を求める