データ構造とアルゴリズム 平成20年度 前期 2年生必修  水曜日 3-4時限.

Slides:



Advertisements
Similar presentations
2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
Advertisements

アルゴリズムと データ構造 第 2 回 アルゴリズムの計算量 基本的なデータ構造(1). 前回の復習(1) アルゴリズムの数学的定義  チューリングマシンで記述可能な手続きをアルゴリズムと呼ぶ データ構造とは  データをコンピュータの記憶部分に組織化して格納する表現方 法 プログラムとは  プログラムはデータ構造を利用して,アルゴリズムをプログラ.
配列の宣言 配列要素の初期値 配列の上限 メモリ領域 多次元配列 配列の応用
データ構造とアルゴリズム 平成20年度 前期 2年生必修  水曜日 3-4時限.
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
ループで実行する文が一つならこれでもOK
プログラミング言語としてのR 情報知能学科 白井 英俊.
第11回 整列 ~ シェルソート,クイックソート ~
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
算法数理工学 第1回 定兼 邦彦.
データ構造と アルゴリズム 理工学部 情報システム工学科 新田直也.
2009/10/9 良いアルゴリズムとは 第2講: 平成21年10月9日 (金) 4限 E252教室 コンピュータアルゴリズム.
地理情報システム論 第3回 コンピュータシステムおける データ表現(1)
第10回 ソート(1):単純なソートアルゴリズム
C言語 配列 2016年 吉田研究室.
データ構造と アルゴリズム 第二回 知能情報学部 新田直也.
情報科学1(G1) 2016年度.
データ構造と アルゴリズム 知能情報学部 新田直也.
岩井 儀雄 コンピュータ基礎演習  ー探索、整列ー 岩井 儀雄
第11回 整列 ~ シェルソート,クイックソート ~
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
シミュレーション演習 G. 総合演習 (Mathematica演習) システム創成情報工学科
二分探索木によるサーチ.
第7回 条件による繰り返し.
プログラミング言語入門 手続き型言語としてのJava
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
その他の図 Chapter 7.
繰り返し計算 while文, for文.
Cプログラミング演習 第7回 メモリ内でのデータの配置.
プログラミング入門 電卓を作ろう・パートIV!!.
プログラミング演習I 2003年5月7日(第4回) 木村巌.
第7回 条件による繰り返し.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
情報処理Ⅱ 第2回:2003年10月14日(火).
プログラミング 4 探索と計算量.
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
コンパイラ 2011年10月20日
補講:アルゴリズムと漸近的評価.
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
地理情報システム論(総)/ 国民経済計算論(商)
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
復習 Cにおけるループからの脱出と制御 break ループを強制終了する.if文と組み合わせて利用するのが一般的. continue
アルゴリズムとプログラミング (Algorithms and Programming)
ネットワーク・プログラミング Cプログラミングの基礎.
第5回 プログラミングⅡ 第5回
精密工学科プログラミング基礎 第7回資料 (11/27実施)
情報処理Ⅱ 2006年11月24日(金).
情報処理Ⅱ 第7回 2004年11月16日(火).
情報処理Ⅱ 2005年10月28日(金).
ヒープソート.
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
Cプログラミング演習 ニュートン法による方程式の求解.
コンパイラ 2012年10月11日
ソフトウェア工学 知能情報学部 新田直也.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
参考:大きい要素の処理.
精密工学科プログラミング基礎Ⅱ 第2回資料 今回の授業で習得してほしいこと: 配列の使い方 (今回は1次元,次回は2次元をやります.)
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
データ構造と アルゴリズムI 第三回 知能情報学部 新田直也.
情報処理Ⅱ 第2回 2004年10月12日(火).
情報処理Ⅱ 2005年11月25日(金).
プログラミング基礎a 第5回 C言語によるプログラミング入門 配列と文字列
プログラミング序論演習.
情報処理Ⅱ 小テスト 2005年2月1日(火).
復習 いろいろな変数型(2) char 1バイト → 英数字1文字を入れるのにぴったり アスキーコード → 付録 int
分岐(If-Else, Else if, Switch) ループ(While, For, Do-while)
情報処理Ⅱ 第8回:2003年12月9日(火).
アルゴリズム ~すべてのプログラムの基礎~.
プログラミング論 バイナリーサーチ 1.
Presentation transcript:

データ構造とアルゴリズム 平成20年度 前期 2年生必修  水曜日 3-4時限

データ構造とは? データ構造(data structure) データをコンピュータで効率的に扱うため,データを組織化して格納する際の形式 データ構造とは?   データ構造(data structure) データをコンピュータで効率的に扱うため,データを組織化して格納する際の形式 各種の型を持った変数を,様々な方法で結びつけたもの 基本的なデータ構造 リスト(list) スタック(stack) キュー(queue) 木(tree) etc. リスト 青木 177 小田 158 金子 167 佐藤 174 渡辺 170

抽象データ型(abstract data type, ADT) 数学モデルとそれに対する様々な操作を組み合わせたもの データが持つべき性質とデータに施せる操作を表わすものであり,“データ”および“操作”がどのように実現されているかは規定しない

抽象 具体的実現 ベクトル x, y (1,2) , (3,-1) ベクトルの大きさ | x | ベクトルの内積 x ・ y 「抽象」と「具体的実現」の例: 抽象 具体的実現 ベクトル x, y (1,2) , (3,-1) ベクトルの大きさ | x | ベクトルの内積 x ・ y 1×3+2×(-1)

参考)データ型(data type) あるプログラミング言語で扱うデータの性格や数値の表現範囲などを規定するもの C言語の基本データ型 整数型 int型 long int型 short int型 etc. 浮動小数点数型 float型 double型 long double型 文字型 char型 etc. 基本的なデータ型を組み合わせて,新たなデータ型を定義できる 組み合わせを作る規則は,プログラミング言語によって異なる

アルゴリズム(algorithm)とは? 与えられた問題を解くための、機械的操作(命令)からなる有限の手続き. どのような値が入力されたときでも,有限個の命令を実行後,必ず停止する.  (無限ループに入らない.)

アルゴリズムの選択基準 開発時間の短かさ デバッグの容易さ プログラムコードの小ささ データのサイズの小ささ 実行時間の短かさ

実行時間を決める要素 入力 コンパイラが出力するオブジェクトコードの質 機械命令(マシン語)の性質と速さ アルゴリズムの計算量(使用するアルゴリズムによって実行時間が大幅に変化する) 一般的に、実行時間は入力データ数 n の関数     実行時間: T(n)

アルゴリズムの評価 アルゴリズムの性能はどのように評価する? プログラムを作成して,実行時間を計る? × ハードウェアやコンパイラの性能によって 結果が異なる × プログラムを書く人の技量に左右される 「計算量(computational complexity)」で評価 そこで、これらに左右されない

計算量   ある仮想的なコンピュータを使用してアルゴリズムを実行した時,どれくらい時間がかかるかを,入力データの大きさ(入力データ数) n の関数として大まかに表現したもの  ⇒時間計算量(time complexity) cf.) (space/memory complexity) アルゴリズムの実行に必要な(メモリ等の)領域をn の関数で表現 プログラムを作るときに,時間と空間のトレードオフを考える必要があることが多い.

計算量の指標と表記法 計算量の指標 最悪の場合の計算量 平均計算量 計算量の表記法 O 記法 Ω記法 (Θ記法)

大きいオー(big-O notation) 関数の増加率の“上界”を表わす記法   ⇒「これより大きくなることはない」 正定数c, n0 が存在し、 n ≧ n0 となる n に対して T(n)≦c・ f (n)  が成立するなら T(n)は O ( f (n) )  ( f (n) のオーダー )である  という。 nが無限大に発散していくときの漸近的挙動を表現 上式を満たす中で、より小さなO ⇒ より正確な解析

例 n2, 2.5n2 , 100+5n+2n2 ⇒ O(n2) n3 , 5n2+4n3 ⇒ O(n3) 一般に T1(n)+T2(n) = O(max (f(n), g(n)) ) T1(n)T2(n) = O( f(n) g(n) ) 定数オーダー(constant order) O(1) 計算量がデータ数nによらず一定

大きいオメガ(Omega notation) 関数の増加率の“下界”を表わす記法   ⇒これより小さくなることはない ある正定数c が存在し、 無限個 の n に対して T(n) ≧ c・ g (n)  が成立するなら T(n)はΩ( g (n) ) (g (n) のオメガ)である  という。 上式を満たす中で、より大きなΩ ⇒ より正確な解析 例  T(n)= n3+2n2 は Ω(n3)である    ∵c=1とすればT(n) ≧ c・n3が成立する

計算量の評価に使用される関数 n の整数乗 (1, n, n2, n3, …) log n 2n 増加率 小 大 1  log n n n log n n2 n3 … nk 2n

増加率の影響 2n n3/2 5n2 100n

プログラムの設計手順 要求定義および仕様記述 概要設計 詳細設計 コーディング(coding) テストとデバッギング(debugging) プログラムの機能を仕様として記述 概要設計 仕様を実現するための作業をモジュールに分解し、   モジュールの機能と、相互関係を決定 詳細設計 モジュールの実現法と接続法を詳細に記述 コーディング(coding) テストとデバッギング(debugging)

モジュール 一つの独立した機能を果たすもの Pascal では procedure や function Cでは関数 給与計算 データの 読込 基本給の 計算 加給の 計算 税金の 計算 手取りの 計算 明細書の 出力 がモジュール この例では各々の

分かり易いプログラムを作るには? 分かり易いプログラムを作るためのアプローチ方法 トップダウン作成法 全体から始め、いくつかのモジュールに分割する作業を反復しつつ、徐々に具体化 (段階的詳細化)  ⇒ 構造化プログラミング データ分析法(ボトムアップ作成法) 基本となるデータ構造を定めたのちに、それに適用する操作の制御構造を明らかにすることを通じてプログラムを作成

段階的詳細化(stepwise refinement) 与えられた問題について,徐々に細部を詰めながら,プログラミング言語に置き換えていく 与えられた整数m(ただしm≧0)が 3の倍数か否か。 mから3を引く処理を繰り返し, m=0になればmは3の倍数である. そうでない場合はmは3の倍数ではない. 数学的モデルを考える 文章で書いたアルゴリズム 適切な抽象データ型を考える 疑似言語でプログラムを記述 使用するプログラミング言語におけるデータ構造を決定 PASCAL,C言語などで記述

段階的詳細化(stepwise refinement) /* 与えられたデータが,3の倍数かどうかを判定する疑似プログラム */ { m が 0 以上の間次の処理を繰り返す{ if (m が 0 に等しい) { 与えられたデータは3の倍数であると出力する; 終了; } else { mから3を引いた値を計算し,新たなmの値とする; } 与えられたデータは3の倍数ではないと出力する; 数学的モデルを考える 文章で書いたアルゴリズム 適切な抽象データ型を考える 疑似言語でプログラムを記述 使用するプログラミング言語におけるデータ構造を決定 PASCAL,C言語などで記述

まとめ アルゴリズム:問題を解くための、機械的操作(命令)からなる有限の手続き.必ず停止する. データ構造:データをコンピュータで効率的に扱うため,データを組織化して格納する際の形式 計算量 :アルゴリズムの評価尺度 O記法とΩ記法

デバッグ(debug)って何? de- 分離、除去 (ex. defroster 霜とり装置) bug (小さな)虫 この作業を支援するソフトウェアのことをデバッガ(debugger)という.デバッガの使い方は,演習Iで.

関数(function)とは? 引数と呼ばれるデータを受け取り,処理を実行し,結果を返すもの 引数(parameter) y S f(x) H x L

関数が値を返すとは?   ある関数を呼び出して計算した値を、呼び出し元の変数に代入すること。

関数が値を返すとは? 関数 関数triangle float triangle(int L, int H){ を呼び出す 関数が値を返すとは?   関数 float triangle(int L, int H){ 三角形の面積を計算;   return 計算結果; } 関数triangle を呼び出す メインプログラム S = triangle(L, H); 計算結果を 関数の呼び出し元に返す

よいプログラミングの習慣 (1)設計計画(仕様の記述、段階的詳細化、etc) (2)カプセル化 (3)既存のものを再利用 (4)ツールを作る

カプセル化(encapsulation) 「データとそのデータに対する操作手続き」を 一つのまとまり(オブジェクト,object)にし,用意された操作を利用しなければデータの参照や変更ができないようにすること 独立性向上 → 保守が容易 再利用が容易 → 開発期間短縮

カプセル化の例 (成績データベース) 抽象データ型 データの 追加 データの 削除 データの 検索 データ 操作 :データ追加 カプセル化の例 (成績データベース) 操作 :データ追加 データ:B君,算数90,英語95 データの 追加 データの 削除 データの 検索 抽象データ型 データ (Name,Math,English)

カプセル化の例 (成績データベース) 抽象データ型 成績表 印刷 データの 追加 データの 削除 データの 検索 データ 操作 :データ検索 カプセル化の例 (成績データベース) 成績表 印刷 操作 :データ検索 データ:A君 算数 85 英語 100 データの 追加 データの 削除 データの 検索 抽象データ型 データ (Name,Math,English) ( A, 85, 100) ( B, 90, 95) データの検索速度を上げるには,この内部のデータ構造や操作のアルゴリズムを見直せばよい  (印刷モジュールには影響しない)

各言語のもつデータ型 データ型 データ構造 抽象データ型 PASCAL C 単純型 基本データ型 列挙型 ポインタ型 ポインタ 構造型 配列 整数型 実数型 論理型 文字型 順序型 列挙型 部分範囲型 ポインタ型 構造型 配列型 レコード型 集合型 etc. C++  クラス C 基本データ型 整数型 浮動小数点数型 文字型 列挙型 ポインタ 配列 構造体 etc. データ型 データ構造 抽象データ型

ひとやすみ

図式プログラミング言語(p.20) 流れ図、フローチャート(flow chart) アルゴリズムやプログラムを視覚的に分かりやすくするための手段として 図が用いられる 流れ図、フローチャート(flow chart) PAD (problem analysis diagram)

フローチャート 計算の各ステップを一つのブロックで表現 各ブロック間の制御の流れを矢印つきの枝で結んだもの 開始 n ← 1 sum ← 0 計算の各ステップを一つのブロックで表現 各ブロック間の制御の流れを矢印つきの枝で結んだもの 右図は1から10までの整数の和を求める処理の例 n<=10? No Yes sum ← sum + n n ← n + 1 和を表示 終了

フローチャートで使用される記号※ 開始、終了の端子 処理 条件分岐 if文やfor文、while文を表現するとき使用 for文 箱の中の文字は、ループカウンタ変数名と 初期値、終了条件、増分 左の例は for( i = 1; i <= 10; i++) i : 1, 10, 1

問題1.次のうち、計算量が一番大きいものはどれか O(1), O(n), O(n2), O(n log n) 本日の問題 問題1.次のうち、計算量が一番大きいものはどれか    O(1), O(n), O(n2), O(n log n) 問題2.計算量が一番小さいものはどれか    O(log n), O(n3), O(n log n), O(n) 問題3.計算量の大きいものから順に並べなさい    O(n log n),  O(n), O(1) , O(n3), O(log n)