岩井 儀雄 iwai@sys.es.osaka-u.ac.jp コンピュータ基礎演習  ー探索、整列ー 岩井 儀雄 iwai@sys.es.osaka-u.ac.jp.

Slides:



Advertisements
Similar presentations
アルゴリズムと データ構造 第 3 回 基本的なデータ構造(2) : 配列 1. 前回の復習 アルゴリズムの計算量 最悪(最大)計算量 計算量の漸近的評価 (オーダ)  多項式時間アルゴリズム( polynomial time algorithm )  指数時間アルゴリズム( exponential.
Advertisements

逐次ソート 2011/05/16. ソート(sort) 順序集合の要素a 1 … a n の上下関係を整 える 一般的には、整数の集合 N を考えればよ い ソートの計算量が問題となる どのような入力に対し、どのようなアル ゴリズムが最適か?
離散システム特論 整列(sorting)アルゴリズム 2.
データ構造とアルゴリズム論 第5章 整列(ソート)のアルゴリズム
アルゴリズムイントロダクション第2章 主にソートに関して
4.ソート 4-1.ソート問題について 4-2.簡単なソートアルゴリズム 4-3.高度なソートアルゴリズム
アルゴリズムとデータ構造 2012年6月27日
第12回 ソート(3): シェルソート、クイックソート
アルゴリズムとデータ構造 第8回 ソート(3).
第10回 整列 ~ バブルソート,挿入ソート,選択ソート~
2分探索.
近似アルゴリズム 第10章 終了時刻最小化スケジューリング
第11回 整列 ~ シェルソート,クイックソート ~
データ構造とアルゴリズム論 第5章 整列(ソート)のアルゴリズム
第11回 整列 ~ バケットソート,基数ソート,ヒープソート~
2009/10/30 整列アルゴリズム (2) 第5講: 平成21年10月30日 (金) 4限 E252教室 コンピュータアルゴリズム.
データ構造とアルゴリズム論 第6章 探索のアルゴリズム
算法数理工学 第1回 定兼 邦彦.
アルゴリズムとデータ構造 第6回演習解答 2015/11/18実施 アルゴリズムとデータ構造 2015.
2009/10/9 良いアルゴリズムとは 第2講: 平成21年10月9日 (金) 4限 E252教室 コンピュータアルゴリズム.
第10回 ソート(1):単純なソートアルゴリズム
C言語 配列 2016年 吉田研究室.
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造 第3回基本的なデータ構造(リスト) 2015/10/28 アルゴリズムとデータ構造 2015.
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
アルゴリズムとデータ構造 補足資料7-3 「単純選択ソートselsort.c」
データ構造とアルゴリズム 分割統治 ~ マージソート~.
①データ構造 ②アルゴリズム ③プログラム言語 ④マークアップ言語
データ構造と アルゴリズム 第八回 知能情報学部 新田直也.
データ構造と アルゴリズム 第十一回 理工学部 情報システム工学科 新田直也.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
アルゴリズム入門.
第11回 整列 ~ シェルソート,クイックソート ~
プログラミング基礎a 第8回 プログラムの設計 アルゴリズムとデータ構造
算法数理工学 第1回 定兼 邦彦.
定兼邦彦 今井浩 東京大学理学系研究科 情報科学専攻
2009/11/6 整列アルゴリズムの復習 第6講: 平成21年11月6日 (金) 4限 E252教室 コンピュータアルゴリズム.
アルゴリズムとデータ構造1 2006年6月16日
アルゴリズムとデータ構造1 2005年7月15日
情報工学概論 (アルゴリズムとデータ構造)
わんくま同盟茶藝部顧問 Microsoft MVP for VC episthmh
データ構造とアルゴリズム論 第6章 整列(ソート)のアルゴリズム
基本情報技術概論(第6回) 埼玉大学 理工学研究科 堀山 貴史
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング基礎a 第8回 プログラムの設計 アルゴリズムとデータ構造
データ構造とアルゴリズム論 第5章 整列(ソート)のアルゴリズム
プログラミング 4 整列アルゴリズム.
2009/10/23 整列アルゴリズム (1) 第4講: 平成21年10月23日 (金) 4限 E252教室 コンピュータアルゴリズム.
プログラミング 4 探索と計算量.
データ構造とアルゴリズム論 第5章 整列(ソート)のアルゴリズム
プログラミング 4 木構造とヒープ.
アルゴリズムとデータ構造1 2006年7月11日
アルゴリズムとデータ構造 2011年6月23日
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
基本情報技術概論(第10回) 埼玉大学 理工学研究科 堀山 貴史
アルゴリズムとデータ構造 2012年7月2日
アルゴリズムとプログラミング (Algorithms and Programming)
基本情報技術概論(第5回) 埼玉大学 理工学研究科 堀山 貴史
バブルソート,バケツソート,クイックソート
アルゴリズムとデータ構造 2011年6月28日
基本情報技術概論(第6回) 埼玉大学 理工学研究科 堀山 貴史
基本情報技術概論(第5回) 埼玉大学 理工学研究科 堀山 貴史
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造 2013年7月2日
ソートのプログラムの流れ 配列の中身を小さい順に並び替える a[1],a[2],…a[n]の値を順に出力する
アルゴリズムとデータ構造 2012年6月25日
ヒープソート.
参考:大きい要素の処理.
データ構造と アルゴリズムI 第三回 知能情報学部 新田直也.
プログラミング論 バイナリーサーチ 1.
Presentation transcript:

岩井 儀雄 iwai@sys.es.osaka-u.ac.jp コンピュータ基礎演習  ー探索、整列ー 岩井 儀雄 iwai@sys.es.osaka-u.ac.jp

データベース データベース 検索キー データの集まり.検索の効率を上げる工夫がされている 検索のための小さなデータ(キーワード) … (例)個人データの場合,電話番号をキーに,住所,生年月日    氏名などをデータに

データベース 挿入 データをキーとともに登録する 探索 与えられたキーを持つデータを探し出す 削除 与えられたキーを持つデータを削除する

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

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

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

二分探索(binary search) {2, 4, 5, 6, 7, 8, 9, 11, 15, 20} から15を探す 3回目 {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)

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

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

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

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

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

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

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

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

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

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

単純な整列(バブルソート) 配列の後ろから先頭に向かって走査し,もし隣り合う二つの要素の大小関係が逆であったら入れ替える 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

単純な整列(バブルソート) 配列の後ろから先頭に向かって走査し,もし隣り合う二つの要素の大小関係が逆であったら入れ替える 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

単純な整列(バブルソート) 配列の後ろから先頭に向かって走査し,もし隣り合う二つの要素の大小関係が逆であったら入れ替える 2回目 3 6 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 55 74 87

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

バブルソート(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])に相当する

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

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

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

選択ソート 整列前 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 入替

選択ソート 整列前 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 6 13 74 20 45 55 87 46 30 4回目  3 6 13 20 74 45 55 87 46 30 5回目  3 6 13 20 30 45 55 87 46 74 6回目  3 6 13 20 30 45 55 87 46 74 7回目  3 6 13 20 30 45 46 87 55 74 8回目  3 6 13 20 30 45 46 55 87 74 9回目  3 6 13 20 30 45 46 55 74 87

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

選択ソート(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の計算部分

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

単純な整列(挿入ソート) 配列の一部分が整列済みの時に,残りの要素を一つずつ整列済みの中に挿入する 整列前 20 6 55 74 3 45 13 87 46 30 1回目  6 20 55 74 3 45 13 87 46 30 2回目 6 20 55 74 3 45 13 87 46 30 3回目  6 20 55 74 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

挿入ソート(疑似コード) 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)

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

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

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

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

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

オーダーの演算 例)

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