プログラミング 4 探索と計算量.

Slides:



Advertisements
Similar presentations
1 高速フーリエ変換 (fast Fourier transform). 2 高速フーリエ変換とは? – 簡単に言うとフーリエ変換を効率よく計算 する方法 – アルゴリズムの設計技法は分割統治法に基 づいている 今回の目的は? – 多項式の積を求める問題を取り上げ、高速 フーリエ変換のアルゴリズムを用いた解法.
Advertisements

授業展開#12 コンピュータの扱いにくい問 題. 扱いにくい問題  処理時間がかかる。  メモリを大量に必要とする。  プログラムの優劣、アルゴリズムの優劣 を比較するためには、標準的なコン ピュータで比較する必要がある。  処理時間を計るのに、コンピュータのモ デルとして、チューリングマシンを考え、
コンピュータプラクティ スⅠ 比較実験 水野嘉明. 本日の予定 計算量について 「比較実験」  パラメータを変化させての比較 ⇒ 実験1  二つのプログラムの比較 ⇒ 実験2  実験レポート R3として提出 2.
アルゴリズムと データ構造 第 3 回 基本的なデータ構造(2) : 配列 1. 前回の復習 アルゴリズムの計算量 最悪(最大)計算量 計算量の漸近的評価 (オーダ)  多項式時間アルゴリズム( polynomial time algorithm )  指数時間アルゴリズム( exponential.
Ibaraki Univ. Dept of Electrical & Electronic Eng. Keiichi MIYAJIMA
配列の宣言 配列要素の初期値 配列の上限 メモリ領域 多次元配列 配列の応用
プログラムのパタン演習 解説.
4.ソート 4-1.ソート問題について 4-2.簡単なソートアルゴリズム 4-3.高度なソートアルゴリズム
アルゴリズムとデータ構造 2012年6月27日
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第4回 配列(2) 情報・知能工学系 山本一公
プログラミング入門2 第4回 配列 for文 変数宣言 初期化
第10回 整列 ~ バブルソート,挿入ソート,選択ソート~
第11回 整列 ~ シェルソート,クイックソート ~
データ構造とアルゴリズム論 第6章 探索のアルゴリズム
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
算法数理工学 第1回 定兼 邦彦.
4-3:高度なソートアルゴリズム① (分割統治法にもとづくソート)
2009/10/9 良いアルゴリズムとは 第2講: 平成21年10月9日 (金) 4限 E252教室 コンピュータアルゴリズム.
第10回 ソート(1):単純なソートアルゴリズム
情報工学概論 (アルゴリズムとデータ構造)
データ構造と アルゴリズム 第二回 知能情報学部 新田直也.
データ構造とアルゴリズム 分割統治 ~ マージソート~.
配列の扱い、探索 有効範囲と記憶域期間 第12回 [7月10日、H.15(‘03)] 今日のメニュー 1 前回の課題の復習
岩井 儀雄 コンピュータ基礎演習  ー探索、整列ー 岩井 儀雄
データ構造と アルゴリズム 第八回 知能情報学部 新田直也.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
データ構造と アルゴリズム 第十一回 理工学部 情報システム工学科 新田直也.
データ構造とアルゴリズム論 第7章 探索のアルゴリズム
第11回 整列 ~ シェルソート,クイックソート ~
第7回 条件による繰り返し.
関数と配列とポインタ 1次元配列 2次元配列 配列を使って結果を返す 演習問題
アルゴリズムとデータ構造1 2006年6月16日
アルゴリズムとデータ構造1 2005年7月15日
高度プログラミング演習 (03).
アルゴリズムとデータ構造 補足資料5-2 「サンプルプログラムsetop.c」
情報工学概論 (アルゴリズムとデータ構造)
講義では、Cプログラミングの基本を学び 演習では、やや実践的なプログラミングを通して学ぶ
第7回 条件による繰り返し.
わんくま同盟茶藝部顧問 Microsoft MVP for VC episthmh
クイックソート.
プログラミング 4 整列アルゴリズム.
プログラムの制御構造 配列・繰り返し.
大岩 元 慶応大学環境情報学部 再帰 データ構造とプログラミング(8) 大岩 元 慶応大学環境情報学部
2009/10/23 整列アルゴリズム (1) 第4講: 平成21年10月23日 (金) 4限 E252教室 コンピュータアルゴリズム.
プログラミング 4 木構造とヒープ.
疑似乱数, モンテカルロ法によるシミュレーション
アルゴリズムとデータ構造1 2006年7月11日
Cプログラミング演習資料.
アルゴリズムとデータ構造 2011年6月23日
計算機プログラミングI 第6回 2002年11月14日(木) アルゴリズムと計算量 第1回課題の説明 平方根を計算するアルゴリズム 計算量
プログラミング 3 2 次元配列.
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
基本情報技術概論(第10回) 埼玉大学 理工学研究科 堀山 貴史
データ構造とアルゴリズム論 第6章 探索のアルゴリズム
アルゴリズムとプログラミング (Algorithms and Programming)
計算機プログラミングI 第4回 2002年10月31日(木) 問題解決とアルゴリズム クラスメソッドと手続きの抽象化 最大公約数
精密工学科プログラミング基礎 第7回資料 (11/27実施)
プログラミング入門2 第5回 配列 for文 変数宣言 初期化
アルゴリズムとデータ構造 2012年6月25日
プログラミング基礎演習 第4回.
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
参考:大きい要素の処理.
精密工学科プログラミング基礎Ⅱ 第2回資料 今回の授業で習得してほしいこと: 配列の使い方 (今回は1次元,次回は2次元をやります.)
高度プログラミング演習 (07).
データ構造と アルゴリズムI 第三回 知能情報学部 新田直也.
プログラミング入門2 第5回 配列 変数宣言、初期化について
情報処理Ⅱ 第3回 2004年10月19日(火).
プログラミング演習I 補講用課題
プログラミング論 バイナリーサーチ 1.
Presentation transcript:

プログラミング 4 探索と計算量

探索アルゴリズム 配列の中から,指定した値を見つける 代表的なものとして 2 つ扱う アルゴリズム(algorithm):計算手順 配列中でその値を見つけた要素番号を返す 複数ある場合は,最初に見つけたもの 1 つでよいものとする 見つからない場合「見つからない」と報告する 代表的なものとして 2 つ扱う 線形探索(リニアサーチ) 二分探索(バイナリサーチ) アルゴリズム(algorithm):計算手順

線形探索(1) 配列の先頭から指定された値を探していく 例:「26」を探す 配列の最後まで達してしまったら「見つからなかっ た」 31 41 a[0] は 31:違う,次へ a[1] は 41:違う,次へ a[2] は 59:違う,次へ a[3] は 26:見つかった! 配列の最後まで達してしまったら「見つからなかっ た」 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] 31 41 59 26 53 58 97 93 23 84

線形探索(2) a[] と要素数 n,探したい値 x を与えて,見つかった らその要素番号を,見つからなければ -1 を返す int linsearch(int a[], int n, int x) { int i; for (i = 0; i < n; i++) { if (a[i] == x) return i; } return -1; } これは書けるようにしておく!

二分探索(1) 整列済み(昇順または降順)の対象に適用できる 探索される範囲の中央の要素と探したい値を比べ,範 囲を狭めていく 例:「31」を探す a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] 23 26 31 49 53 58 59 84 93 97 23 26 31 49 53 58 59 84 93 97 23 26 31 49 53 58 59 84 93 97

二分探索(2) 昇順に整列された要素数 n の a[] から,x を探す(見つ からないときは -1 を返す) int binsearch(int a[], int n, int x) { int l, r, m; l = 0; r = n - 1; while (l <= r) { m = (l + r) / 2; if (a[m] == x) return m; if (x < a[m]) { r = m - 1; } else { l = m + 1; } } return -1; }

線形探索と二分探索の比較 アルゴリズムの特徴 適用する場合の条件 手間 線形探索:先頭から値を探していく 二分探索:「半分半分」にして範囲を絞り込む 適用する場合の条件 線形探索:特になし 二分探索:整列済みである必要がある 手間 線形探索:探索する要素数が倍になれば手間も倍になる 二分探索:探索する要素数が倍になっても手間は +1 程度 二分探索のほうが手間が少ない……!?

計算量(1) ある処理が,どれくらい手間がかかるのかをはかる指 標(時間計算量) 単に「計算量」といえばたいてい時間計算量をさす どれくらい記憶容量を要するのかをはかることもある(空間 計算量) 時間計算量は,本当に時間を計ると,環境ごとに違ってしま う→手間・実行回数を計る(数える) 多くの場合,データ数に対する手間の増え方を問題にする

計算量(2) 例 1:配列の合計を求める関数 int sumary(int a[], int n) { int i, s; s = 0; for (i = 0; i < n; i++) { s += a[i]; } return s; } データ数(要素数)n について 要素数が倍になると,手間はおよそ倍になる この処理の手間は,およそ要素数に比例する

計算量(3) 例 2:配列の要素の最大値を求める int amax(int a[], int n) { int m, i; m = a[0]; for (i = 0; i < n; i++) { if (a[i] > m) { m = a[i]; } } return m; } この処理は,データ数 n に比例する程度の手間がか かる

計算量(4) 例 3:n 点の中のもっとも遠いものを求める double maxdist(Point pt[], int n) { double m, d; int i, j; m = 0; for (i = 0; i < n - 1; i++) { for (j = i + 1; j < n; j++) { d = (pt[j].x - pt[i].x) * (pt[j].x - pt[i].x) + (pt[j].y - pt[i].y) * (pt[j].y - pt[i].y); if (d > m) { m = d; } } } return sqrt(m); } 繰り返し回数は n(n - 1) / 2 = (n2 – n) / 2 回 n の 2 次式で表される

計算量(5) 例 4:n を 10 進表記で逆順に出力させる void revdig(int n) { while (n > 0) { printf(“%d”, n % 10); n /= 10; } printf(“\n”); return; } n の桁数だけの手間がかかる n が 10 倍になると手間が +1 になる

計算量(6) 計算の手間(計算量)は多くの場合,繰り返しの回数 で決まる 計算の手間を数式で表して見積もる 繰り返しがデータ数などでどのように増えるかを調べること が重要 計算の手間はデータ数に比例する 計算の手間はデータ数の 2 乗に比例する データ数が x 倍になると手間が +1 される 計算の手間を数式で表して見積もる 場合によって繰り返し回数が変動する場合がある if 文のように場合によって実行されたりされなかったりする 場合がある 計算量の見積もりは多くの場合「ざっくり」行う

計算量のオーダ(1) 計算量は,「比例する程度」などに近い表現で表す 対象とする量(おもにデータ数 n)がじゅうぶんに大 きい場合で見積もる オーダ記法 O(・) で表す n に比例する程度:O(n) n の 2 乗に比例する程度:O(n2) n にかかわらずいつも同じ:O(1) かっこの中には,計算量を式で表したときのもっとも次数が 高い項を書く 計算量が厳密には n2 + 3n + 6 だったら O(n2) 最高次の係数(定数倍)は省略する

計算量のオーダ(2) 例 1:配列の合計→O(n) 例 2:配列の最大値→O(n) 例 3:距離の最大値→O(n2) 係数の 1/2 は省略,1 次以下の項は無視する 例 4:数を逆順出力→O(log n) 「一方を〇倍すると他方は +1」の関係は log になる 対数の底は,底変換で定数倍になるのでなんでもよい

計算量のオーダ(3) 加算:大きいほうを残す 乗算:乗算する 処理が続けて行われる場合(合計の計算量) O(n) + O(n2) → O(n2) O(log n) + O(n) → O(n) 乗算:乗算する 処理が繰り返される場合 O(n) × O(n) → O(n2) O(n) × O(log n) → O(n log n) 計算量の序列 O(1) < O(log n) < O(√n) < O(n) < O(n log n) < O(n2) < O(n3) < …… < O(cn)(指数) 指数オーダは計算の手間がかかりすぎる,「事実上計算でき ない」とされる

探索アルゴリズムの計算量 線形探索 二分探索 計算量は,平均の場合と最悪の場合を分けて議論する 場合がある 平均して n / 2 回繰り返される →平均の場合:O(n) 見つからない場合は最悪で,n 回繰り返される →最悪の場合:O(n) 二分探索 対象が倍になったら 1 増える →O(log n) 計算量は,平均の場合と最悪の場合を分けて議論する 場合がある アルゴリズムによっては,最悪の場合にひじょうに手間がか かるものがある