2009/10/9 良いアルゴリズムとは 第2講: 平成21年10月9日 (金) 4限 E252教室 コンピュータアルゴリズム.

Slides:



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

Ibaraki Univ. Dept of Electrical & Electronic Eng. Keiichi MIYAJIMA
アルゴリズムと データ構造 第 2 回 アルゴリズムの計算量 基本的なデータ構造(1). 前回の復習(1) アルゴリズムの数学的定義  チューリングマシンで記述可能な手続きをアルゴリズムと呼ぶ データ構造とは  データをコンピュータの記憶部分に組織化して格納する表現方 法 プログラムとは  プログラムはデータ構造を利用して,アルゴリズムをプログラ.
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
アルゴリズムイントロダクション第2章 主にソートに関して
プログラミング入門2 第4回 配列 for文 変数宣言 初期化
第7講: 平成19年11月2日 (金) 4限 E252教室 クイックソートと オーダー記法.
ファーストイヤー・セミナーⅡ 第8回 データの入力.
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
算法数理工学 第1回 定兼 邦彦.
4-3:高度なソートアルゴリズム① (分割統治法にもとづくソート)
第2回ネットワークプログラミング 中村 修.
1. アルゴリズムと計算量.
第10回 ソート(1):単純なソートアルゴリズム
データ構造と アルゴリズム 第二回 知能情報学部 新田直也.
第6章 2重ループ&配列 2重ループと配列をやります.
岩井 儀雄 コンピュータ基礎演習  ー探索、整列ー 岩井 儀雄
データ構造と アルゴリズム 第八回 知能情報学部 新田直也.
第11回 整列 ~ シェルソート,クイックソート ~
プログラミング基礎a 第8回 プログラムの設計 アルゴリズムとデータ構造
算法数理工学 第1回 定兼 邦彦.
第7回 条件による繰り返し.
2009/10/16 いろいろなデータ構造 第3講: 平成21年10月16日 (金) 4限 E252教室 コンピュータアルゴリズム.
2009/11/6 整列アルゴリズムの復習 第6講: 平成21年11月6日 (金) 4限 E252教室 コンピュータアルゴリズム.
繰り返し計算 while文, for文.
関数の定義.
第10回関数 Ⅱ (ローカル変数とスコープ).
アルゴリズムとデータ構造1 2006年6月16日
プログラミング2 関数の再帰呼び出し
アルゴリズムとデータ構造 補足資料5-2 「サンプルプログラムsetop.c」
2011/06/21-24 情報知能学科「アルゴリズムとデータ構造」 担当:白井英俊
情報工学概論 (アルゴリズムとデータ構造)
第7回 条件による繰り返し.
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
高度プログラミング演習 (08).
アルゴリズムとプログラミング (Algorithms and Programming)
関数の再帰呼び出しとは ハノイの塔 リダイレクト レポート課題
プログラミング基礎a 第8回 プログラムの設計 アルゴリズムとデータ構造
プログラミング 4 整列アルゴリズム.
プログラミング言語論 第四回 理工学部 情報システム工学科 新田直也.
2009/10/23 整列アルゴリズム (1) 第4講: 平成21年10月23日 (金) 4限 E252教室 コンピュータアルゴリズム.
プログラミング 4 探索と計算量.
再帰的手続き.
11.再帰と繰り返しの回数.
プログラムの基本構造と 構造化チャート(PAD)
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング 3 2 次元配列.
補講:アルゴリズムと漸近的評価.
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
計算機プログラミングI 第4回 2002年10月31日(木) 問題解決とアルゴリズム クラスメソッドと手続きの抽象化 最大公約数
プログラミング入門2 第5回 配列 for文 変数宣言 初期化
プログラミング2 関数の再帰呼び出し
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
Q q 情報セキュリティ 第8回:2004年5月28日(金) の補足 q q.
高度プログラミング演習 (07).
関数と再帰 教科書13章 電子1(木曜クラス) 2005/06/22(Thu.).
プログラミング演習I 2003年6月11日(第9回) 木村巌.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
第10回 関数と再帰.
Q q 情報セキュリティ 第7回:2005年5月27日(金) q q.
プログラミング入門2 第5回 配列 変数宣言、初期化について
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
情報処理Ⅱ 第8回:2003年12月9日(火).
プログラミング演習I 補講用課題
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング論 バイナリーサーチ 1.
Presentation transcript:

2009/10/9 良いアルゴリズムとは 第2講: 平成21年10月9日 (金) 4限 E252教室 コンピュータアルゴリズム

第 1 講の復習 アルゴリズムの定義 ユークリッドの互除法 フローチャートの描き方 擬似言語の書き方 入力と出力 正当性,決定性,有限性,停止性 ユークリッドの互除法 フローチャートの描き方 擬似言語の書き方 2009/10/9

第 1 講の補足 フローチャート と 擬似言語 擬似言語とは この部分のこと int gcd(int m, int n) { do{ フローチャート と 擬似言語 start m と n を入力 m ÷ n の余りを r とする r = 0 ? m ← n n ← r No n を出力 Yes end int gcd(int m, int n) { do{ r ← m ÷ n の余り; m ← n; n ← r; }while(r <> 0); return m; } 擬似言語とは この部分のこと 2009/10/9

今日の講義の内容 良いアルゴリズムの評価基準 多項式時間アルゴリズムと指数時間アルゴリズム オーダ記法 再帰アルゴリズム 時間計算量 領域計算量 多項式時間アルゴリズムと指数時間アルゴリズム オーダ記法 再帰アルゴリズム 2009/10/9

計算量 アルゴリズムの計算量 アルゴリズムを実行するのに必要となる計算の量 計算量が小さい=アルゴリズムは効率的 時間計算量 領域計算量 アルゴリズム実行に必要な時間の尺度 領域計算量 アルゴリズム実行に必要な領域(メモリ)の尺度 計算量が小さい=アルゴリズムは効率的 時間計算量と領域計算量はトレードオフの関係 本講義では時間計算量で評価していく 2009/10/9

平均計算量と最大計算量 一般にアルゴリズムの計算量は入力に依存する アルゴリズムごとに「得意な入力」と「苦手な入力」がある 最大(時間,空間)計算量 最も不得意な入力が与えられたときの計算量 平均(時間,空間)計算量 全ての入力に対する計算量の平均 2009/10/9

時間計算量の評価例 1 #define MAX 5 int perm[MAX]={2, 5, 3, 4, 1}; search(key)/* 配列 perm の中から値 key の位置を探す */ int key; { int i = 0; while (i < MAX) { if (perm[i] == key) return(i); i++; } return(-1); 配列:データを一列に並べたもの,先頭から番号を使って参照できる 例 perm[i]: 配列 perm の i 番目の要素 key の値 1   2   3   4  5 ステップ数 15   3   9  12 6 2009/10/9

時間計算量の評価例 2 最大ステップ数 15 = 3 × MAX 平均ステップ数 key の値 1 2 3 4 5 ステップ数 15   3   9  12 6 2009/10/9

計算量評価のコストパフォーマンス プログラムのステップ数を厳密に評価することは,一般にはかなり手間がかかる ステップ数を厳密に評価しても,現実世界の時間単位への対応付けは難しい もっと大雑把で良いから簡単に使える尺度が欲しい! ⇒ アルゴリズムのオーダー 2009/10/9

アルゴリズムのオーダー アルゴリズムの時間計算量が f(n) のオーダーである: O(f(n)) である 入力データの大きさ n に対し,アルゴリズムの実行時間が関数 f(n) に比例して増加する 係数は考えない 最大ステップ数 15 = 3 × MAX 平均ステップ数 さきほどの例の場合: 配列サイズ=入力データサイズと考えると... 最大時間計算量,平均時間計算量とも O(n) である 2009/10/9

オーダーの見積もり 計算量のオーダー表現: アルゴリズムを小さな操作単位に分割 各操作単位のオーダーを評価 きわめて大雑把な評価尺度 大雑把な見積もりで導出することができる アルゴリズムを小さな操作単位に分割 各操作単位のオーダーを評価 操作単位のオーダーを合成して,全体のオーダーを得る 2009/10/9

アルゴリズムの分割 実行時間が入力サイズに依存しないステップ (基本ステップ) ループ回数が入力サイズに依存するループ構造 search(key) /* 配列 perm の中から値 key の位置を探す */ int key; { int i = 0; while (i < MAX) { if (perm[i] == key) return(i); i++; } return(-1); 実行時間が入力サイズに依存しないステップ (基本ステップ) ループ回数が入力サイズに依存するループ構造 2009/10/9

オーダーの評価 (1) ルール 1:基本ステップのオーダーは O(1) 基本ステップ 一般に,以下は基本ステップでないことに注意 実行時間が入力サイズに依存しないステップ 変数への代入 数値の演算 ポインタ操作 etc. 一般に,以下は基本ステップでないことに注意 (入力サイズに依存した)配列のコピー 関数呼び出し 2009/10/9

オーダーの評価 (2) ルール 2: O(f(n)) の操作と O(g(n)) の操作を連続して行う場合,操作全体のオーダーは O(max(f(n), g(n))) O(f(n)) O(max(f(n), g(n))) O(g(n)) ただし,関数の大小比較は増加率により行う 1 < log n < n < n log n < n2 < n3 < … 2n 2009/10/9

オーダーの評価 (3) ルール 3: O(f(n)) 回だけまわるループの内部で O(g(n)) の操作を実行する場合,全体のオーダーは O(f(n) × g(n)) O(f(n)) 回ループ O(f(n) × g(n)) O(g(n)) 係数は無視してよい 最高次の項以外は無視してよい 2009/10/9

アルゴリズムの分割 O(1) O(n) O(1) O(n) O(n) O(1) O(1) O(1) O(1) search(key) /* 配列 perm の中から値 key の位置を探す */ int key; { int i = 0; while (i < MAX) { if (perm[i] == key) return(i); i++; } return(-1); O(1) O(n) O(1) O(n) O(n) O(1) O(1) O(1) O(1) ループの回数: 平均時,最悪時とも O(n) ⇒ 平均時間計算量,最大時間計算量とも O(n) 2009/10/9

練習問題 1 以下の手続きのオーダーを求めよ 全体は O(1) + O(n) + O(1) = O(n) void maxmin(int a[], int n) { int i, max, min; max = min = a[0]; for (i = 1; i < n - 1; i++) { if (max < a[i]) max = a[i]; if (min > a[i]) min = a[i]; } printf(“%d, %d\n”, max, min); O(1) 全体は O(1) + O(n) + O(1) = O(n) O(n) O(1)×O(n) = O(n) 2009/10/9

練習問題 2 以下の手続きのオーダーを求めよ 全体は O(1) + O(n) + O(n) + O(1) = O(n) void maxmin2(int a[], int n) { int i, max, min; max = min = a[0]; for (i = 1; i < n - 1; i++) if (max < a[i]) max = a[i]; if (min > a[i]) min = a[i]; printf(“%d, %d\n”, max, min); } O(1) 全体は O(1) + O(n) + O(n) + O(1) = O(n) O(n) O(1)×O(n) = O(n) 2009/10/9

練習問題 3 以下の手続きのオーダーを求めよ 全体は O(n2) void bubble(int a[], int n) { int i, j, t; for (i = 0; i < n - 1; i++) for (j = n - 1; j > i; j--) if (a[j – 1] > a[j]) { t = a[j]; a[j] = a[j – 1]; a[j – 1] = t; } O(n)×O(n) = O(n2) O(n) O(1)×O(n) = O(n) O(n) O(1) 2009/10/9

オーダー評価:特殊ケース 1 条件分岐部の評価には要注意 if (x % 2 == 0) O(f(n)) の処理 else 計算量は O(g(n)) の処理 計算量は O(max(f(n), g(n))) if (x % 2 == 3) O(f(n)) の処理 else O(g(n)) の処理 計算量は O(g(n)) 表現上の構造にとらわれず,実質的な振舞いの把握が必要 2009/10/9

オーダー記法に用いる関数 n,nlogn,n2,n3 : n の多項式 2n,n!,nn : n の指数関数 多項式時間アルゴリズム Polynomial Time Algorithm 現実的  2n,n!,nn : n の指数関数 指数時間アルゴリズム Exponential Time Algorithm 非現実的 2009/10/9

多項式オーダーと指数オーダー 計算速度向上の効果 2009/10/9

再帰アルゴリズム 自身の引数より小さな引数で自身を呼び出す 自明なケースの処理が存在 表面的にループが出現しない 処理手順が自身を用いて定義されているもの recursive (n) { if (自明なケース) { 自明なケースの処理 ; /* 終了条件 */ } else { recursive (m) ; /* m < n */ (処理) ; } 自身の引数より小さな引数で自身を呼び出す 自明なケースの処理が存在 表面的にループが出現しない 2009/10/9

再帰プログラムの例: 階乗の計算 階乗 ヒント プログラム 例: 6! = 5×4×3×2×1 例: 6! = 5×4×3×2×1 ヒント 6! = 6×5!,5! = 5×4!,・・・,2! = 2×1!,1! = 1 プログラム int fact (int n) { int m; if(n = 1) return(1); else{ m = fact(n-1); return(n × m); } ちょっとフローチャートでは書けない 2009/10/9

再帰プログラムの概念 ちょっと分かりにくいので以下の図のように考えるとよい 6 2 return(4×6); return(3×2); int fact (4) { m = fact(3); return(4 × m); } int fact (3) { m = fact(2); return(3 × m); } 6 2 int fact (2) { m = fact(1); return(2 × m); } return(4×6); return(3×2); fact(4) = 24 = 4×3×2×1 int fact (1) { return(1); } 1 return(2×1); 2009/10/9

r=0 でないなら n と r の 最大公約数を求める ユークリッドの互除法を再帰で書く ヒント r = 0 でないなら,m,n の最大公約数の代わりに n,r の最大公約数を求める int gcd (int m, int n) { int r; r = m % n; if(r = 0) return(n); else return( gcd(n,r) ); } r=0 なら n が 最大公約数 r=0 でないなら n と r の 最大公約数を求める 2009/10/9

入力が n のときの,この再帰プログラムの計算量を Tn とする オーダー評価:特殊ケース 2 再帰プログラムのオーダー評価は,少し面倒 int recursive(int n) { if (n <= 1) return(1); else return(recursive(n – 1) + recursive(n – 1)); } 入力が n のときの,この再帰プログラムの計算量を Tn とする この場合のステップ数は,漸化式 Tn = 2Tn-1 で与えられる ⇒ 計算量は O(2n) (互除法は Tn = Tn-1 なので O(n)) 2009/10/9

第 2 講のまとめ アルゴリズムの評価は時間計算量で行う 計算量の評価にはオーダー記法を使う 多項式オーダーと指数オーダー 再帰プログラム 領域計算量もある 計算量の評価にはオーダー記法を使う 並んでいる計算量は足し算 繰り返しに含まれる計算量は掛け算 係数は省略する 多項式オーダーと指数オーダー 指数オーダーのアルゴリズムは使い物にならない 再帰プログラム 2009/10/9