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

Slides:



Advertisements
Similar presentations
アルゴリズムと データ構造 第 2 回 アルゴリズムの計算量 基本的なデータ構造(1). 前回の復習(1) アルゴリズムの数学的定義  チューリングマシンで記述可能な手続きをアルゴリズムと呼ぶ データ構造とは  データをコンピュータの記憶部分に組織化して格納する表現方 法 プログラムとは  プログラムはデータ構造を利用して,アルゴリズムをプログラ.
Advertisements

プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
第11回 整列 ~ シェルソート,クイックソート ~
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
プログラミング入門2 第10回 動的な領域確保 情報工学科 篠埜 功.
ファーストイヤー・セミナーⅡ 第8回 データの入力.
データ構造とアルゴリズム 第10回 mallocとfree
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
基礎プログラミングおよび演習 第9回
プログラミング基礎I(再) 山元進.
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
2009/10/9 良いアルゴリズムとは 第2講: 平成21年10月9日 (金) 4限 E252教室 コンピュータアルゴリズム.
第8回 プログラミングⅡ 第8回
アルゴリズムとデータ構造 2011年6月13日
情報理論2 第6回 小林 学 湘南工科大学 2011年11月15日 〒 神奈川県藤沢市辻堂西海岸1-1-25
プログラミング入門2 第12回 データ型 関数のプロトタイプ宣言 動的な記憶域確保 芝浦工業大学情報工学科 青木 義満
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
演習問題の答え #include #include #define NUM 5 typedef struct { // 構造体の定義 float shincho; // 身長 float taiju; // 体重 } shintai; void hyouji(shintai.
第11回 整列 ~ シェルソート,クイックソート ~
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
情報処理Ⅱ 2007年11月5日(月).
データ構造とアルゴリズム 第4回 リスト ~ データ構造(1)~.
Cプログラミング演習 第7回 メモリ内でのデータの配置.
iioLoadFile()とiioMallocImageBuffer()の補足
iioLoadFile()とiioMallocImageBuffer()の補足
精密工学科プログラミング基礎 第10回資料 (12/18実施)
プログラミング 4 記憶の割り付け.
アルゴリズムとデータ構造 補足資料11-1 「mallocとfree」
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
プログラミング演習I 2003年5月7日(第4回) 木村巌.
メモリの準備 メモリには、その準備の方法で2種類ある。 静的変数: コンパイル時にすでにメモリのサイズがわかっているもの。 普通の変数宣言
プログラミング入門2 第11回 情報工学科 篠埜 功.
前回の練習問題.
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
プログラミング入門2 第12回 データ型 関数のプロトタイプ宣言 動的な記憶域確保 芝浦工業大学情報工学科 青木 義満
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
プログラミング 4 探索と計算量.
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
精密工学科プログラミング基礎Ⅱ 第5回資料 今回の授業で習得してほしいこと: 構造体 (教科書 91 ページ)
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
11: 動的メモリ確保 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
プログラミング 3 2 次元配列.
補講:アルゴリズムと漸近的評価.
ポインタとポインタを用いた関数定義.
アルゴリズムとデータ構造 2012年6月11日
アルゴリズムとプログラミング (Algorithms and Programming)
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
情報処理Ⅱ 2006年11月24日(金).
プログラミング入門2 第5回 配列 for文 変数宣言 初期化
情報処理Ⅱ 第7回 2004年11月16日(火).
11: 動的メモリ確保 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと
プログラミング 4 文字列.
11: 動的メモリ確保 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
情報処理Ⅱ 2006年11月8日(金).
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング入門2 第5回 配列 変数宣言、初期化について
プログラミング演習II 2003年10月29日(第2,3回) 木村巌.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

アルゴリズムと データ構造 第 3 回 基本的なデータ構造(2) : 配列 1

前回の復習 アルゴリズムの計算量 最悪(最大)計算量 計算量の漸近的評価 (オーダ)  多項式時間アルゴリズム( polynomial time algorithm )  指数時間アルゴリズム( exponential time algorithm ) 配列 ポインタの復習 2

演習問題の答え 第 1 問 次のような計算量 T(n) について、そのオーダを求めなさい (a) T(n) = 1.5n n n (b) T(n) = 4logn + 8n (c) T(n) = 3n 2 + 7nlog3 n (d) T(n) = 2 n + 3n 5 手順: (1) 定数倍を無視 (2) 最も大きくなる n の項だけを残 す = 3n 2 + 7n 2 log3 = (3+7log3) n 2 注意: 2 n のような「2」は定数倍ではない。 n の関数に『掛け算』されている『数』が 無視の対象 O(n 3 ) O(n) O(n 2 ) O(2 n ) 3

演習問題の答え 第 2 問 計算量 T(n)= 2 n+1 のとき、そのオーダは 2 n といえるか。 また、 T(n)=2 2n のときはどうか示しなさい。 解答: T(n) = 2 2n のとき、定義を用いて証明する ①.この定義に従い、T(n)= 2 2n がO( 2 n )であると仮定する。 ②. 2 つの正の定数 n 0 と c が存在して、n≧ n 0 なるすべてのnに対して、 2 2n ≦ c2 n が成り立つ。 ③.この不等式の両辺を 2 n で割ると、 2 n ≦cとなる。 ④.ここで、nが大きくなったとき、この式の左辺は無限大になるが、右 辺は定数である。 ⑤.これは、この不等式が成り立つことに矛盾している。 したがって、 T(n)= 2 2n のときのオーダは 2 n とはいえない。 4

演習問題の答え 第 2 問 計算量 T(n)= 2 n+1 のとき、そのオーダは 2 n といえるか。 また、 T(n)=2 2n のときはどうか示しなさい。 解答:(解法 2) 極限理論を用いて証明する 5

動的メモリ管理 今までのメモリを割り当てる方法  int a; →1 個しか割り当てられない  int a[10]; → あらかじめ割り当てる個数(たとえば 10 個)が決ま っていないとダメ 要らなくなったとき解放できない 動的なメモリ割り当て / 解放 malloc(), calloc(,) 関数 free() 関数を使う 6

動的メモリ管理 動的メモリ管理とは  プログラム実行中に、記憶域を必要な分確保  不要になった記憶域は開放 動的メモリ管理でできること  プログラム開始後に配列領域の大きさを決定  関数内で新規作成したデータの返却 7

動的メモリ管理 記憶域の確保 必要な時に、必要な分だけメモリを割り当てる. 割り当ての結果,空っぽの配列が生成される. 書式: void *malloc(unsigned int size) 引数:割り当てるバイト数 返り値:割り当てた領域の先頭ポインタ(失敗すれば NULL ) 例)ポインタ p を先頭に 100byte 割り当てるときに は? 任意の型 *p; // 先頭ポインタ p 定義 p=malloc(100); //100byte 割り当て 8

malloc の使い方の例(1) char *x; x=(char *) malloc(1000*sizeof(char)); 処理をする free(x); 念のため char  型にキャストする // 解放する 1000 byte 分のメモリを確保する ①②③④ →x[1000] が確保された! … char は 1 バイトを取る 9

補足 : キャストと sizeof 演算子 キャスト演算子 データ型を変換する操作 float x; int y; y=(int) x; sizeof 演算子 引数の型のサイズを byte 数で返す sizeof(int) = 4 sizeof(char) = 1 書式: (型)式 「式」で示すデータが「型」に変換される 型が違うものを代入するときなどに使用 書式: (型)式 「式」で示すデータが「型」に変換される 型が違うものを代入するときなどに使用 10

malloc の使い方の例( 2 ) int *y; y=(int *) malloc(1000*sizeof(int)); 処理をする free(y); int  型にキャストする // 解放する 4000 byte 分のメモリを確保する 4 * 1000 = 4000 byte 分のメモリを確保する →y[1000] が確保された! … ①②③ int は4バイトを取る 11

動的メモリ管理 記憶域の確保  calloc 関数 void *calloc(size_t nmemb, size_t size) size で指定したバイト数を単位として、要素 nmemb 個の記憶 域を確保して返す 確保された記憶域は 0 初期化される 確保に失敗すると NULL が返される 12

動的メモリ管理 記憶域の開放 free 関数  不要になったときメモリを解放し,他のプログラ ムで使えるようにする.  書式: void free(void *ptr) 引数: 解放するメモリのポインタ 返り値: なし (void)  例)ポインタ p から始まる, malloc/calloc で割り当 てした領域を解放するには? free(p); //p から始まる領域解放 13

動的メモリ管理 動的配列の確保 char *str; str = calloc(100, sizeof(char)); scanf(“%s”, str); printf(“%s\”, str); free(str); ・ char 型 100 個分の領域を確保 ・ 不要になったら free で開放するのを忘れずに 14

動的メモリ管理 動的配列の確保 int *make_array(int n) { return (calloc(n, sizeof(int))); } ・ n 個の要素を持つ int 型配列を返す関数 ・ 確保に失敗した場合は NULL が返される ・ この関数を呼んだ方で、使用後 free を実行する必要あり 15

整数の動的生成 実行結果 *x = 57 16

配列の動的生成 実行例 入力 要素数: 4 4 個の整数を入力してください。 a[0]: 10 a[1]: 73 a[2]: 2 a[3]: -5 出力 各要素の値は以下のとおりです。 a[0] = 10 a[1] = 73 a[2] = 2 a[3] = -5 17

配列要素の最大値 要素 3 の配列の最大値 int a[3]; int max; max = a[0]; If (a[1] > max) max = a[1]; If (a[2] > max) max = a[2]; 18

配列要素の最大値 要素 n の配列の最大値 int a[n];/* 便宜上の宣言例 */ int max; max = a[0]; If (a[1] > max) max = a[1]; If (a[2] > max) max = a[2]; ・・・ If (a[n - 1] > max) max = a[n - 1]; 19

配列要素の最大値 要素 n の配列の最大値 int a[n];/* 便宜上の宣言例 */ int max, i; max = a[0]; for (i = 1; i < n; i++) If (a[i] > max) max = a[i]; 20

フローチャート 開始 a[0] → max 終了 i : 1, 1, n-1 走査 Yes No a[i] > max a[i] → max 21

配列要素の最大値を求める関数 22

配列要素の最大値を求めるメイン処理 実行例 入力 人数: 5 5 人の身長を入力してくださ い。 height[0]: 172 height[1]: 153 height[2]: 192 height[3]: 140 height[4]: 165 出力 最大値は 192 です。 23

配列要素の並びの反転 交換 交換 交換 n / 2 回 24

配列要素の並びの反転 アルゴリズムの流れ 1. 先頭と最後尾を交換 2. それぞれ 1 つずつ内側を交換 3. 以下中央に来るまで繰り返し for (i = 0; i < n / 2; i++) a[i] と a[n - i - 1] を交換 25

配列要素の並びの反転 2 値の交換  作業用に同じ型の変数を介して交換 x と y を交換するとき、作業用変数 t を用意した場合: 1. x の値を t に代入 2. y の値を x に代入 3. t の値を y に代入 26

配列要素の並びの反転 反転プログラム int i; for (i = 0; i < n / 2; i++) { int t = a[i]; a[i] = a[n - i - 1]; a[n - i - 1] = t; } 27

配列要素の並びの反転関数 28

配列要素の並びの反転メイン処理 実行例 入力 要素数: 5 5 個の整数を入力してくださ い。 x[0]: 10 x[1]: 73 x[2]: 2 x[3]: -5 x[4]: 42 出力 配列の要素の並びを反転しま した。 x[0] = 42 x[1] = -5 x[2] = 2 x[3] = 73 x[4] = 10 29

基数変換 10 進整数から n 進整数へ  変換する数を n で割った剰余を求める 剰余を求めたら商に対して順次繰り返し 商が 0 になったら終了 (10) (8) AA(16) 2691 下位桁 上位桁 30

基数変換関数 31

基数変換メイン処理 実行例 入力 10 進数を基数変換します。 変換する非負の整数: 59 何進数に変換しますか (2-36 ): 2 出力 2 進数では です。 入力 もう一度しますか( 1--- はい /0--- いい え): 0

まとめ 動的メモリ管理 配列の応用  整数の動的生成  配列要素の最大値を求める関数  配列要素の並びの反転  基数変換 33 予習: 次回は、多次元配列、構造体、配列によるリスト