2.39k likes | 2.5k Views
コンピュータの言語. 2011 年度 秋学期 金曜1・2限 1限担当:山添大丈 2限担当:荻野正樹. コンピュータの言語 第六回. コンピュータのための処理手順 アルゴリズムの基礎 その2. 2. 2 . コンピュータのための 処理手順. アルゴリズムの基礎 データの探索と整列 様々なアルゴリズム. 第1回中間テストの結果. 1 時間目クラス. 2 時間目クラス. コンピュータと言語 2011 中間試験1回目. Q1. 14 通りの情報を表すには、( )ビット必要 ? a. 1, b. 2, c. 3, d. 4
E N D
コンピュータの言語 2011年度 秋学期 金曜1・2限 1限担当:山添大丈 2限担当:荻野正樹
コンピュータの言語 第六回 コンピュータのための処理手順 アルゴリズムの基礎 その2 2
2. コンピュータのための処理手順 アルゴリズムの基礎 データの探索と整列 様々なアルゴリズム
第1回中間テストの結果 1時間目クラス 2時間目クラス
コンピュータと言語2011 中間試験1回目 Q1. 14通りの情報を表すには、( )ビット必要? a. 1, b. 2, c. 3, d. 4 Q2. 2000通りの情報を表すには、( )バイト必要? a. 1, b. 2, c. 3, d. 4 Q3. M(メガ)は、10の( )乗? a. 3, b. 4, c. 5, d. 6 Q4. (2.25)10を2進数で表すと? a 1.01 b 10.001 c 1.001 d 10.01 Q5. (31.25)10を16進数で表すと? a 2F.2 b 2F.4 c 1F.2 d 1F.4 Q6. (101.01001)2を10進数で表すと?a 3.28125 b 5.28125 c 3.625 d 5.625 Q7. (101.01001) 2を16進数で表すと?a A.8F b 5.8F c A.48 d 5.48 注意:計算が大変だと思うので下記を参考にすること 1/2=0.5, 1/4=0.25, 1/8=0.125, 1/16=0.0625, 1/32=0.03125, 1/64=0.015625 Q8.アルファベット、数字を表現できる文字コードを( )バイト文字コードと呼ぶ。 a. 1, b. 2, c. 3, d. 4 Q9.漢字も表現できる文字コードを( )バイト文字コードと呼ぶ。a. 1, b. 2, c. 3, d. 4 Q10.世界中の文字を統一的に表すことを目指した文字コードとして、( )がある。 a. ASCII, b. EBCDIC, c. JIS, d. Unicode Q11. 赤色を6桁の16進数で表すと(??)となる a. FF0000, b. 00FF00, c. 0000FF, d. FFFFFF Q12. 紫色を6桁の16進数で表すと(??)となるa. FFFF00, b. 00FFFF, c. FF00FF, d. FFFFFF Q13. (5A2)16を10進数で表すと? Q14. (26)10 を2進数で表すと?
アルゴリズムとは(続き) • 計算などの問題を解くための手順 • コンピュータの上で実行可能な処理手順 • 曖昧な記述ではコンピュータが実行できない • アルゴリズムの表現 ⇒ フローチャート(流れ図) • 順次処理が基本 • 条件分岐 • 繰り返し処理 フローチャートの例 開始 i = 7 No i > 0 Yes iの値を出力 i = i - 2 終了
アルゴリズムの構造化定理 • どんな複雑な処理手順も3種類の基本構造から組み立てることができる • 1つの入口と1つの出口を持つすべてのプログラムは,「順次」「選択」「繰り返し」の3つの基本構造の組合せによって記述することができる 入口 プログラム 順次 選択 繰り返し 出口
変数 a 変数 a 変数 a 3 5 変数とは • 1つの値(数値や文字列)を一時的に保存する場所 • 格納された値は,後から参照することができる JavaScriptによるプログラム例 変数 a が利用できるようにする(変数 a を宣言する) var a; a = 3; a = 5; 変数 a に数値3 を代入する 変数 a に数値5 を代入する(元の値3は参照できなくなる)
フローチャートの統一記号 開始 A=1? (A増加ループ) AをA+1に A>=16 終了 ここに示したのは日本工業規格(JIS)で定められた統一記号の一部 10
カウンタ変数 iの変化 1回目 → (初期値) i = 22回目 → (1回目の値+3) i = 53回目 → (2回目の値+3) i = 84回目 → (3回目の値+3) i = 11 〔4回目は終了条件( i > 10 )が 成り立つので実行されない〕 カウンタ変数 i を2から始めて,3ずつ増やしながら処理を繰り返し,i が10より大きくなれば終了する カウンタ変数を用いた繰り返し(例) • 「変数 : 初期値,増分,終了条件」を並べて示す ループ名 条件が成り立てば終了する ループA i : 2 , 3 , i>10 カウンタ変数 終了条件 1回の繰り返しにおけるカウンタ値の増分 カウンタ変数の初期値 カウンタ変数の増分 処理 ループA
2. コンピュータのための処理手順 アルゴリズムの基礎 データの探索と整列 様々なアルゴリズム
2. コンピュータのための処理手順 アルゴリズムの基礎 データの探索と整列 様々なアルゴリズム
コンピュータの言語 第六回 コンピュータのための処理手順 アルゴリズムの基礎 その2 14
実用的なアルゴリズム • 整列(ならべかえ)アルゴリズム • 選択ソート (基本選択法) • クイックソート • 探索(指定のものがあるか探す)アルゴリズム • 逐次探索 • 二分探索
5 4 3 0 1 2 配列とは • 複数の値を連続して保存する場所 • ひとつひとつの保存場所 → 配列の要素 • 保存場所を区別する数値 → 配列の添字 プログラム言語では配列の添字は0(ゼロ)から始まる 3 4 12 JavaScriptによるプログラム例 var data = new Array(6);data[0] = 3;data[1] = 4;data[3] = 12; 配列変数 data 6個の値が格納できる(添字 0~5) 4番目の要素(添字3)に 値12 を代入する
整列アルゴリズム 主にやるのは、 1.選択ソート(基本選択法) 2.クイックソート
いろいろな整列アルゴリズム • 選択法 • 選択ソート(基本選択法),ヒープソート • 交換法 • クイックソート,バブルソート(基本交換法), • 挿入法 • 挿入ソート(基本挿入法),シェルソート(改良挿入法) • 併合法 • マージソート • 基数法 • ラディックスソート(基本整列法)
SelectionSort 整列アルゴリズム: 選択ソート (基本選択法) • 昇順の場合(1,2,3,4....という順番) • 全データの中から最も小さいデータを探して先頭のデータと入れ換える • 次に,2番目以降に並んでいるデータの中で最も小さいデータを取り出して2番目のデータと入れ換える • この操作を,末尾から2番目のデータと末尾のデータの比較が行われるまで続ける • 降順の場合(10,9,8,7....という順番) • 昇順の場合と同じ方法で,最も大きいデータと入れ換えるようにする
基準となる先頭を1つずつずらしながら,順番が決定していないデータの中から最小値を見つける基準となる先頭を1つずつずらしながら,順番が決定していないデータの中から最小値を見つける 28 3 3 17 25 24 10 3 10 17 25 24 28 17 入れ換える 3 10 17 25 24 24 28 残りの中から最小値を探す 3 10 17 24 25 25 28 3 28 17 25 24 10 10 入れ換える 3 10 17 24 25 28 選択ソートによる整列(昇順) 全体から最小値を探す
60 40 10 30 80 1 20 70 1 20 10 60 40 80 70 整列アルゴリズム2: クイックソート 整列したいデータの中から軸(基準)となる値を選ぶ 軸より小さなデータは全て左側へ,軸より大きなデータは全て右側へ移動させる 入れ替えが終了したらデータを2つに分けて,それぞれのデータに対して同じ操作を繰り返す 中央値を基準(軸)にする 軸より大 軸より小 軸より大 軸より小 (1) 移動させる (2) 1 20 10 30 60 40 80 70 (3) 基準の中央の値で分けられた 左右のいずれかが0個または1個になると,その部分のデータは整列されている 軸より大きい部分 をクイックソート 軸より小さい部分 をクイックソート 1 10 20 40 60 70 80 1 20 10 10 1 1 20 20 1 10 20
探索アルゴリズム ある数字や対象を探す 1.逐次探索 2.二分探索
逐次探索 [同じものがない時] • 配列に格納されたデータを,先頭から1つずつ順番に調べる. • 目的の値(キー)に一致するデータが見つかれば処理を終了する 「大阪」は何番目にあるか? 注) 配列の添字は0から始まる 添字 配列 先頭から1つずつ調べていく 4番目に見つかった 違う 違う 違う
二分探索 <前提条件> • データが予め昇順か降順に整列していること • 整列(ソート) • データをある順番に並べること • 整列アルゴリズムは何種類も考えられている • 昇順と降順 • 昇順: データを値の小さいものから順に並べること • 例 (1,2,3,4,5,6) • 降順: データを値の大きいものから順に並べること • 例 (6,5,4,3,2,1)
二分探索:並べてあるデータで探索 効率的に • 逐次探索の場合と比べて.. • 逐次探索では先頭から順番に探索するため,データ数が多いほど探索時間は長くなる(効率的な探索ではない) • 順番に並べてあるデータでは、より効率的な探索方法として二分探索法がある(データ数が多くなっても効率が著しく低下しない!!) • 二分探索の手順 「キー」は目的のデータ 配列のほぼ中央にあるデータとキーを比較する そのデータがキーと合致したら探索終了 合致しなければ,配列を半分にして中央のデータとキーの比較を行う データが見つかるまでこの操作を繰り返す
OrderedArray 二分探索の例 データは予め整列していることが前提 重要 • 配列中から値が10のデータを探す 中央値の添字には添字の最小値と最大値の平均値(小数点以下切捨て)を用いる 中央値 の添字 中央値 0 1 2 3 4 5 6 7 8 9 10 目的の値(10)は中央値(11)より小さい 中央値に対して大きいか小さいか によって絞り込む 目的の値(10)は中央値(5)より大きい データを半分ずつ絞り込んでいく 目的のデータ
それぞれのアルゴリズムとフローチャート カウンタ変数やフローチャートの書き方など 思い出していきましょう
整列アルゴリズム 主にやるのは、 1.選択ソート(基本選択法) 2.クイックソート
SelectionSort 整列アルゴリズム: 選択ソート (基本選択法) • 昇順の場合(1,2,3,4....という順番) • 全データの中から最も小さいデータを探して先頭のデータと入れ換える • 次に,2番目以降に並んでいるデータの中で最も小さいデータを取り出して2番目のデータと入れ換える • この操作を,末尾から2番目のデータと末尾のデータの比較が行われるまで続ける • 降順の場合(10,9,8,7....という順番) • 昇順の場合と同じ方法で,最も大きいデータと入れ換えるようにする
基準となる先頭を1つずつずらしながら,順番が決定していないデータの中から最小値を見つける基準となる先頭を1つずつずらしながら,順番が決定していないデータの中から最小値を見つける 28 3 3 17 25 24 10 3 10 17 25 24 28 17 入れ換える 3 10 17 25 24 24 28 残りの中から最小値を探す 3 10 17 24 25 25 28 3 28 17 25 24 10 10 入れ換える 3 10 17 24 25 28 選択ソートによる整列(昇順) 全体から最小値を探す
28 3 17 25 24 10 3 10 17 25 24 28 3 10 17 25 24 28 3 10 17 24 25 28 3 28 17 25 24 10 3 10 17 24 25 28 選択ソートでdata[i]配列を考える N = 6 のとき i番目の値を仮の最小値(min)とし,残りの i +1番目から N-1番目までで最小のデータを探す 開始 i を0から4(N-2)まで,1ずつ増やす ループ1 i : 0, 1, i≧N-1 0 1 2 3 4 5 i = 0 3 i 番目からN-1番目までのデータから最小値minを探す 10 i = 1 17 i = 2 i 番目のデータdata[i]と 最小値minとを入れ換える i = 3 24 i = 4 25 ループ1 終了
28 3 17 25 24 10 3 10 17 25 24 28 3 10 17 25 24 28 3 10 17 24 25 28 3 28 17 25 24 10 3 10 17 24 25 28 選択ソートのフローチャート min(最小値) place(配列での minの場所) 開始 ?? ?? ループ1 i : 0, 1, i ≧ N-1 ループ2 j : i+1, 1, j ≧ N 0 1 2 3 4 5 i = 0 3 min = data[i] data[j]<min No 10 i = 1 place = i i = 2 17 Yes 並べ替え対象の先頭 min = data[j] i = 3 24 minの場所 place = j i = 4 25 data[i] と data[place]を 入れ替える ループ2 ループ1 後の<練習問題>での観測点 終了
繰り返しのループが交差してはいけない(不適切な例)繰り返しのループが交差してはいけない(不適切な例) ループ1 条件1 ループ2 条件2 処理 A ループ1 処理 B ループ2 繰り返しの入れ子(2重ループ) 繰り返しの中で,繰り返しを行うことも可能 ループ1 条件1 ループ2 条件2 処理 A ループ2 処理 B ループ1
<練習 2-13>選択ソートにおけるデータの様子 • 基本選択法によって4個のデータ を整列させるとき,ループ2内で j の値が更新される直前に各変数の値がどのように変化するか以下の表に記入せよ 配列名 data は d と略記している
<練習 2-13> (解答)選択ソートにおけるデータの様子 • 基本選択法によって4個のデータ を整列させるとき,ループ2内で j の値が更新される直前に各変数の値がどのように変化するか以下の表に記入せよ 配列名 data は d と略記している 60 40 30 2 30 3 10 10 10 60 30 40 2 30 30 3 40 30 10 30 60 40 2 3 40 40
60 40 10 30 80 1 20 70 1 20 10 60 40 80 70 整列アルゴリズム2: クイックソート 整列したいデータの中から軸(基準)となる値を選ぶ 軸より小さなデータは全て左側へ,軸より大きなデータは全て右側へ移動させる 入れ替えが終了したらデータを2つに分けて,それぞれのデータに対して同じ操作を繰り返す 中央値を基準(軸)にする 軸より大 軸より小 軸より大 軸より小 (1) 移動させる (2) 1 20 10 30 60 40 80 70 (3) 基準の中央の値で分けられた 左右のいずれかが0個または1個になると,その部分のデータは整列されている 軸より大きい部分 をクイックソート 軸より小さい部分 をクイックソート 1 10 20 40 60 70 80 1 20 10 10 1 1 20 20 1 10 20
クイックソートの考え方 開始 軸の値を設定 (1) 軸を基準としたデータの入換え (2) 軸より左側のデータ列に対して クイックソート (3) クイックソート 軸より右側のデータ列に対して クイックソートのアルゴリズムは,自分で自分自身を再帰的に呼び出す 終了
クイックソート 選択ソート 選択ソート クイックソート 性能の比較
探索アルゴリズム ある数字や対象を探す 1.逐次探索 2.二分探索
逐次探索 [同じものがない時] • 配列に格納されたデータを,先頭から1つずつ順番に調べる. • 目的の値(キー)に一致するデータが見つかれば処理を終了する 「大阪」は何番目にあるか? 注) 配列の添字は0から始まる 添字 配列 先頭から1つずつ調べていく 4番目に見つかった 違う 違う 違う
x == data[1] Yes No x == data[2] Yes No より多くのデータを探索できるようにするには? (繰り返し構造を用いる) 逐次探索(データが3個の場合) xは1つ目のデータ data[0] と等しいか? • 探索すべきデータを x とする • 3個のデータが配列 data に格納されている 開始 x == data[0] Yes No data[0]data[1] data[2] データ数が3個のとき有効な添字は 0 ~ 2 探索成功 終了
逐次探索のフローチャート(カウンタ変数を用いた繰り返し)逐次探索のフローチャート(カウンタ変数を用いた繰り返し) 開始 見つけるべきデータ x, データ配列 data, データ数 size を与える 初期値: 0 増分: 1 終了条件: i ≧ size ループ1 i : 0, 1, i ≧ size data[0]data[1] data[2] data[3] ・・・data[size-1] x == data[i] が成り立つ Yes x == data[i] size個 探索成功 No ループ1 データ数がsize個のとき有効な添字は 0 ~ size-1 終了
前ページの逐次探索のフローチャートを,ループ端記号の代わりに選択構造を用いて書換える.右の空欄 (a) (b) に当てはまる内容を答えなさい <練習 2-10> 逐次探索フローチャートでのループ書換 開始 (a) (b) No Yes Yes x == data[i] No 探索成功 i = i + 1 終了
配列の添字は0 から始まる i = 0 <練習 2-10> (解答)逐次探索フローチャートのループ書換 開始 (a) 探索が失敗した時,ここを通る (b) No i < size 有効な添字は 0 ~ size-1 Yes Yes x == data[i] No 探索成功 i = i + 1 ループ端記号を用いると繰り返しの処理(背景色が灰色部分)を簡潔に表すことができる 終了
二分探索 <前提条件> • データが予め昇順か降順に整列していること • 整列(ソート) • データをある順番に並べること • 整列アルゴリズムは何種類も考えられている • 昇順と降順 • 昇順: データを値の小さいものから順に並べること • 例 (1,2,3,4,5,6) • 降順: データを値の大きいものから順に並べること • 例 (6,5,4,3,2,1)
二分探索:並べてあるデータで探索 効率的に • 逐次探索の場合と比べて.. • 逐次探索では先頭から順番に探索するため,データ数が多いほど探索時間は長くなる(効率的な探索ではない) • 順番に並べてあるデータでは、より効率的な探索方法として二分探索法がある(データ数が多くなっても効率が著しく低下しない!!) • 二分探索の手順 「キー」は目的のデータ 配列のほぼ中央にあるデータとキーを比較する そのデータがキーと合致したら探索終了 合致しなければ,配列を半分にして中央のデータとキーの比較を行う データが見つかるまでこの操作を繰り返す
OrderedArray 二分探索の例 データは予め整列していることが前提 重要 • 配列中から値が10のデータを探す 中央値の添字には添字の最小値と最大値の平均値(小数点以下切捨て)を用いる 中央値 の添字 中央値 0 1 2 3 4 5 6 7 8 9 10 目的の値(10)は中央値(11)より小さい 中央値に対して大きいか小さいか によって絞り込む 目的の値(10)は中央値(5)より大きい データを半分ずつ絞り込んでいく 目的のデータ
L (low) : データを探索する配列の最小の添字 H (high) : データを探索する配列の最大の添字 M (mid) : 中央値の添字 M M-1 M+1 data[M] の値 11 が中央値となる 配列の中央値 [x] は xを越えない整数を表す (x が正の数なら切捨てと同じ) M = [ (L+H) / 2 ] L H 配列 data
(3 < data[M] なので H = M-1) L: 0 H: 1 (3) 1 2 • L>H のとき探索対象データがない(探索失敗) • L<H または L=H の間は探索が成功する可能性がある M: 0 (3 > data[M] なので L = M+1) L: 1 H: 1 (4) 2 M: 1 (3 > data[M] なので L = M+1) (5) L: 2 H: 1 「3」の探索はL > H となって失敗する 二分探索による絞込みの例:13個のデータから「3」を検索 L: 0 M: 6 H: 12 (1) data (3 < data[M] なので H = M-1) (2) L: 0 H: 5 〔(L+H) / 2 の結果を切捨てる〕 添字 M = [ (L+H) / 2 ] 配列の中央値 data[M] M: 2 「1」の探索なら成功!(このとき L < H ) 「2」の探索なら成功!(このとき L = H )
<練習問題> での観測点 x >= data[M] x <= data[M] x == data[M] が成り立つ 二分探索のフローチャート ループ L > H 開始 M = [(L+H) / 2] L = 0 Yes x < data[M] H = size - 1 No H = M - 1 No x > data[M] 最大の添字は(データ数-1) Yes L = M + 1 見つけるべきデータ x, データ配列 data, データ数 size は予め与えられるものとする 探索成功 ループ 終了