アルゴリズムと データ構造 第2回 アルゴリズムの計算量 基本的なデータ構造(1) 前回の復習(1) アルゴリズムの数学的定義 データ構造とは チューリングマシンで記述可能な手続きをアルゴリズムと呼ぶ データをコンピュータの記憶部分に組織化して格納する表現方法 プログラムとは プログラムはデータ構造を利用して,アルゴリズムをプログラミング言 語で表現したものである 前回の復習(2) アルゴリズムの例1 身長順の名簿を作りたい 問題の解決 プログラムを作る データ型,データ構造の決定 アルゴリズムの決定 アルゴリズムの例2 「ある正整数mが3の倍数であるかどうかを求める」 アルゴリズムと手続きの違い アルゴリズムの例3 三つの整数値の最大値を求める フローチャート while文、for文による繰り返し構造 演習問題の答え 第1問 整数 a、b を含め、その間の全整数の和を求めるフローチャートを記述せよ。 なお、a と b の大小関係にかかわらず和を求められるようにせよ。 また、a と b が等しい場合は、和は a(または b)そのものとなることとする。 演習問題の答え 第2問 第 1 問のフローチャートを実現する関数int sumof(int a, int b) を作成せよ。 アルゴリズムの計算量 計算量を測るための前提 どのようなコンピューターで処理することを前提としているか ノイマン型コンピューター 並列コンピューター ベクトルコンピューター 量子コンピューター ランダムアクセス記憶 逐次実行型 アルゴリズムの良し悪しを議論するときは、個々のコンピューター の性能に依存せず、一般性で表せるものに限る 時間・領域計算量 時間計算量 アルゴリズムを実行したときの命令の数 領域計算量 アルゴリズムを実行したときに使用する変数や配列の数 時間計算量の種類 最悪(最大)計算量 あるアルゴリズムAに対して、入力データが与えられればその実行に掛 かる計算時間が決まるが、大きさがnであるすべての入力のうちで計算 時間が最大のもの TA(n) = MAX (xに対するAの計算時間) size(x)=n である x 最良の計算時間を比較しても無意味. 入力サイズによって変化しない. 全体から見ると例外的な状況. たまたま a と b が一致する場合. たまたま a, b のいずれかが他方の倍数になっている場合. アルゴリズムの性能を表しているとは言いがたい. 一般に最悪または平均の計算時間を比較する. 最悪(最大)時間計算量: 解析的に求めやすい. 平均時間計算量: より実態を表しているが,解析が困難. 最大時間計算量を求める 例1: アルゴリズムA: 例2: アルゴリズムB: int s=25; ① ② ③ sum = 0; for (i = 1; i <= n; i++) sum += i; TA(n) = 1 TB(n) = 1+(n+1)+n=2n+2 例3 アルゴリズムC: 大きさnの配列D[1:n]の中にある数のうちで最大のものを求める ⑥ big ← D[1] for (i = 2; i <= n; i++) { if( D[i] > big){ big ← D[i]; } } ⑦ Print (big); ① ② ③ ④ ⑤ TC(n) = 1+n+(n-1) +(n-1)+1 = 3n 計算量の漸近的評価 例4 ある問題を解く3つのアルゴリズムA,B,Cがある、これらの時間計算量TA(n), TB(n),TC(n)を求めたところ、それぞれ TA(n)= 10000n3 TB(n)=1000n2 + 10nlogn TC(n)=n4 であった。3つのうちでどのアルゴリズムの効率が一番良いといえるであろうか。 オーダ記法 計算量T(n)が、ある関数f(n)に対してO(f(n)) (オーダf(n))であるとは、適当な2つの正の 定数n0とcが存在して、n≧ n0となるすべてのnに対して、T(n)≦cf(n)が成り立つことをいう 計算量T(n)が、ある関数f(n)に対してO(f(n)) であるとき、f(n)をT(n)の漸近的上界という T(n)のオーダはf(n)である 計算量の漸近的評価 例5 計算量T(n)が、T(n)=4n3+2nであるとする. n≧1なるすべてのnに対して、 T(n)=4n3+2n ≦ 4n3+2n3 = 6n3 が成り立つので、T(n)はO(n3)である 例6 計算量T(n)が、T(n)=2n+ nlog2nであるとする. n≧4なるすべてのnに対して 、 T(n)= 2n+ nlog2n = n(2+log2n) ≦ n(log2n+log2n) = 2nlog2n が成り立つので、T(n)はO(nlog2n)である 評価のルール1 T(n)がいくつかの項の和になっているときには、主要項のみを残す、それ以外の項は無視してよい 主要項:nの値が大きくなるに連れて一番大きくなる項 評価のルール2 T(n)の主要項の係数も無視して良い オーダ記法の基本的な性質 和の規則 T1(n)とT2(n)をそれぞれO(f1(n)), O(f2(n))である計算量とし、このとき、 T1(n)+T2(n) は O(max(f1(n), f2(n)))である 積の規則 T1(n)とT2(n)をそれぞれO(f1(n)), O(f2(n))である計算量とする、このとき、 T1(n)・T2(n) は O(f1(n)・ f2(n)))である 例3 アルゴリズムC: 大きさnの配列D[1:4]の中にある数のうちで最大のものを求める ① ② ③ ④ ⑤ ⑥ ⑦ big ← D[1] for (i = 2; i <= n; i++) { if( D[i] > big){ big ← D[i]; } } O(n) Print (big); 例4 ある問題を解く3つのアルゴリズムA,B,Cがある、これらの時間計算量TA(n), TB(n),TC(n)を求 めたところ、それぞれ O(n3) TA(n)= 10000n3 O(n2) TB(n)=1000n2 + 10nlogn O(n4) TC(n)=n4 であった。3つのうちでどのアルゴリズムの効率が一番良いといえるであろうか。 注意点 1. T(n)の増加の様子を一番良く表す単純な関数を用いる T(n) ≦ cn2 2. 3. ≦ cn3 ≦ cn4 ≦ … オーダによる評価は漸近的な評価で、計算量の第1次近似でしかない 指数時間アルゴリズムは、現実的ではない 図:オーダ評価 に用いられる関 数の増加の様 子 スーパーコンピューター京 多項式時間アルゴリズム(polynomial time algorithm) 時間計算量が、n,nlogn, n2, n3等のようなnの多項式のオーダであるようなアルゴリズム 指数時間アルゴリズム(exponential time algorithm) 時間計算量が、2n, n!, nn等のようなnの多項式のオーダであるようなアルゴリズム 配列 配列の必要性 配列の定義 配列(Array) は、同一型の変数である要素(element)が集まって直線状に並ん だデータ構造である 配列の基本 同じ型の要素の集合体 要素の型は任意:算術型、ポインタ、構造体、共用体、配列など 配列の宣言と利用 宣言 int a[5]; /* aは要素型がint型で要素数5の配列 */ Cの場合は添字が double height[20]; /* heightは要素型がdouble型で要素数20の配列 必ず0から始まる! a[i] 初期化と利用 int a[5]; /* int型で要素数5の配列を宣言 */ /* a[0]からa[4]まで利用可能 */ /* a[1]に5を代入 */ /* a[3]から値を取り出しxに代入 */ /* 配列の要素数をsに代入 */ a[1] = 5; x = a[3]; s = sizeof(a) / sizeof(a[0]); int a[5] = {1, 2, 3, 4, 5} ; /* 配列宣言時に初期化可能 */ 配列の特徴 各要素はメモリ上に同じサイズで連続して格納される 添え字(インデクス)を指定することで,要素にランダムにアク セス( random access )可能 使いたいデータにすぐアクセスできること CDプレーヤは聴きたい曲にランダムアクセス可能 カセットテープは聴きたい曲を前から順に探す必要がある ⇒シーケンシャルアクセス(sequential access) data[4] 例) アドレス 100: y = data[2]; 104: 108: 個々のセルに整数型の要素 が格納されている. メモリ 170 160 158 173 data[0] data[1] data[2] data[3] 配列の短所 データの数をあらかじめ宣言する必要がある int a[3]; データを格納するための領域を自由に追加したり、 不要になったら領域を開放したい… どうする? ⇒ ポインタを利用 (復習)ポインタ(pointer)とは 変数を指し示すためのデータ型 他のデータへの参照を示す(他のデータがある場所 の番地が格納される) ポインタ型がある言語: C, PASCAL ポインタ型がない言語: BASIC, FORTRAN ポインタ メモリ空間 アドレス 80番地 : ptr 104番地 : n 「ptrはnを指している」 とは? ポインタ型変数ptr int型変数n ポインタとアドレス メモリ空間 アドレス 80番地 : 104番地 104番地 : 50 変数nのデータが入っ ているメモリ上のアドレ スが格納される ポインタ型変数ptr int型変数n ポインタ型変数宣言の例 int n; int *ptr; n = 50; ptr = &n; ← nはint型の変数 ← ptrは int型の変数を指すポインタ変数 ポインタであることを表わす記号 (“アスタリスク”という) アドレス演算子 (単項&演算子, &operator) データが格納されているアドレスを 取り出す演算子 ポインタ型変数宣言の例 n ptr int n; int *ptr; 80番地 : 1004番地 : n = 50; ptr = &n; 80番地 : 1004番地 : 50 80番地 : 1004番地 1004番地 : 50 まとめ アルゴリズムの計算量 最悪(最大)計算量 計算量の漸近的評価 (オーダ) 配列 ポインタの復習 演習問題 第1問 次のような計算量T(n)について、そのオーダを求めなさい (a) T(n) = 1.5n2+0.6n3 + 8.3n (b) T(n) = 4logn +8n (c) T(n) = 3n2 + 7nlog3n (d) T(n) = 2n + 3n5 第2問 計算量T(n)= 2n+1のとき、そのオーダは2nといえるか。また、T(n)=22nのときはどうか示し なさい。 名前と学籍番号をご記入のうえ、解答用紙(A4)を提出する 提出先: 工学部電子情報実験研究棟5階 NO.5506室のドアのポストに入れてください 締め切り時間: 来週月曜日(4月28日) 午前9時まで
© Copyright 2024 ExpyDoc