アルゴリズム入門.

Slides:



Advertisements
Similar presentations
アルゴリズムとプログラミン グ (Algorithms and Programming) 第6回:クラスとインスタンス クラスの宣言 アクセス修飾子 インスタンスの生成 (new キーワード) this キーワード フィールドとメソッドの実際の定義と使い 方 クラスの宣言 アクセス修飾子 インスタンスの生成.
Advertisements

組合せ最適化輪講 2.3 連結性 川原 純. 2.3 連結性 内容 – グラフ上の節点をすべてたどるアルゴリズム 計算機上でのグラフの表現 – 強連結成分を求めるアルゴリズム トポロジカル順序を求める方法も – k- 連結、 k- 辺連結について – 2- 連結グラフの耳分解について.
アルゴリズムとデータ構造 第2回 線形リスト(復習).
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
アルゴリズムイントロダクション第2章 主にソートに関して
4.ソート 4-1.ソート問題について 4-2.簡単なソートアルゴリズム 4-3.高度なソートアルゴリズム
アルゴリズムとデータ構造 2012年6月27日
アルゴリズムとデータ構造1 2008年7月22日
第10回 整列 ~ バブルソート,挿入ソート,選択ソート~
第11回 整列 ~ シェルソート,クイックソート ~
第11回 整列 ~ バケットソート,基数ソート,ヒープソート~
算法数理工学 第1回 定兼 邦彦.
アルゴリズムとデータ構造1 2007年6月12日
アルゴリズムとプログラミング (Algorithms and Programming)
2009/10/9 良いアルゴリズムとは 第2講: 平成21年10月9日 (金) 4限 E252教室 コンピュータアルゴリズム.
第10回 ソート(1):単純なソートアルゴリズム
プログラミング実習 1・2 クラス 第 1 週目 担当教員:  渡邊 直樹.
データ構造とアルゴリズム 分割統治 ~ マージソート~.
データ構造と アルゴリズム 知能情報学部 新田直也.
岩井 儀雄 コンピュータ基礎演習  ー探索、整列ー 岩井 儀雄
データ構造と アルゴリズム 第八回 知能情報学部 新田直也.
大岩 元 慶応大学環境情報学部 二分木 データ構造とプログラミング(10) 大岩 元 慶応大学環境情報学部
最短経路.
第11回 整列 ~ シェルソート,クイックソート ~
プログラミング言語入門 手続き型言語としてのJava
Cプログラミング演習 中間まとめ2.
アルゴリズムとデータ構造 2011年7月4日
第9章 例外処理,パッケージ 9.1 例外処理 9.2 ガーベッジコレクション.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
アルゴリズムとデータ構造 2013年7月16日
アルゴリズムとデータ構造1 2006年6月16日
アルゴリズムとデータ構造1 2005年7月15日
情報工学概論 (アルゴリズムとデータ構造)
オブジェクト指向 プログラミング 第七回 知能情報学部 新田直也.
アルゴリズム入門.
第9回 優先度つき待ち行列,ヒープ,二分探索木
アルゴリズムとデータ構造1 2005年7月1日
復習+α JBuilderの使い方を思い出す。 配列とGUI 再帰とマージソート 木と二分木の探索
プログラミング 4 整列アルゴリズム.
アルゴリズムとデータ構造1 2005年6月24日
2009/10/23 整列アルゴリズム (1) 第4講: 平成21年10月23日 (金) 4限 E252教室 コンピュータアルゴリズム.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
プログラミング 4 探索と計算量.
再帰的手続き.
アルゴリズムとデータ構造1 2006年7月11日
アルゴリズムとデータ構造 2011年6月23日
プログラミング演習Ⅲ- Sorting Quick Sort and Merge Sort
アルゴリズムとプログラミング (Algorithms and Programming)
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
第9回 優先度つき待ち行列,ヒープ,二分探索木
アルゴリズムとデータ構造 2012年7月2日
アルゴリズムとプログラミング (Algorithms and Programming)
アルゴリズムとデータ構造 2011年6月28日
情報工学概論 (アルゴリズムとデータ構造)
計算機プログラミングI 第4回 2002年10月31日(木) 問題解決とアルゴリズム クラスメソッドと手続きの抽象化 最大公約数
アルゴリズムとデータ構造 2013年7月2日
アルゴリズムとデータ構造 2013年7月8日
アルゴリズムとデータ構造 2012年6月25日
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
参考:大きい要素の処理.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
プログラミング演習I 2003年6月11日(第9回) 木村巌.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
アルゴリズムとデータ構造 2012年7月9日
プログラミング論 バイナリーサーチ 1.
Presentation transcript:

アルゴリズム入門

アルゴリズムとは 問題を解くための計算手順 曖昧さのない形式的な記述 計算機による実行も可能。 通常は、問題のどのような事例に対しても、 停止することを要請。

データ構造とは データの計算機上での表現方法 同じデータにも多数の表現方法がある。 例えば、集合を表現するには、 様々なデータ構造 辞書 ハッシュ表 優先度つき待ち行列、2分探索木 トライ、平衡木、MFSET 様々なデータ構造 リスト、スタック、待ち行列、写像 木 グラフ

アルゴリズムとデータ構造 アルゴリズム+データ構造=プログラム 具体的なデータ構造に対して、 アルゴリズムを計算機に実行可能な形式、 すなわちプログラミング言語によって 記述したものがプログラムである。 データ構造が違えば、アルゴリズムも異なる。 すると、プログラムの効率も違って来る。

アルゴリズムの計算量 入力のサイズに従って、 計算の手間がどのように増えるか。 時間計算量 領域計算量 計算にかかる時間 計算に費やされるメモリの量 つまり、計算の過程において、 中間結果を保持するためにどのくらいの メモリが必要か。

例:線形探索 static int search(int[] a, int key) { int n = a.length; for (int i = 0; i < n; i++) if (a[i] == key) return i; return -1; } 等しさは== 代入は=

配列について 整数の配列 int[] a; このように変数を宣言しただけでは、 配列の本体はまだない。(aの値はnull) 配列の生成 a = new int[100]; 変数aは、配列への参照(reference)を保持している。 宣言+生成 int[] a = new int[100]; 配列の長さ a.length 配列を引数として渡したり、配列をメソッドの値として返したりりすることができるが、それはすべて、 参照をやりとりしている。 sort(a, 0, a.length-1)

for文 for (int 制御変数 = 初期値; 条件; 更新部) { ... } 条件 更新部 i<n i<=n i++ i = i+1 i += 1 i += 2

例:二分探索 static int search(int[] a, int key) { int low = 0; int high = a.length-1; while (low <= high) { int middle = (low + high) / 2; if (key == a[middle]) return middle; else if (key < a[middle]) high = middle -1; else low = middle + 1; } return -1;

二分探索の計算量 配列の大きさをnとする。 whileループを回る度に、 探索する範囲が半分(以下)に減るので、 log2nに比例した時間(以下)で keyが見つかるか、 keyが見つからずに終了して-1が返る。 時間計算量はO(log2n) この場合は、最悪の計算量 線形探索の計算量はO(n)

バブルソート static void bubblesort(int[] a, int from, int to) { for (int i = from; i <= to; i++) for (int j = to; j > i; j--) if (a[j-1] > a[j]) { int w = a[j]; a[j] = a[j-1]; a[j-1] = w; }

配列のランダムな初期設定 static void random(int[] a, int from, int to) { java.util.Random r = new java.util.Math.Random(); for (int i = from; i <= to; i++) a[i] = r.nextInt(65536); }

public static void main(String[] args) { int[] a = new int[10]; random(a, 0, 9); print(a, 0, 9); bubblesort(a, 0, 9); }

ソーティングの計算量 選択ソートおよびバブルソートは、 配列の大きさをnとしたとき、 時間計算量はO(n2) 配列によらない。

時間の計測 SystemクラスのcurrentTimeMillis()という スタティック・メソッドを用いることができる。 long t0 = System.currentTimeMillis(); ... long t1 = System.currentTimeMillis(); System.out.println(t1-t0);

演習 Sortingにおいて、 long t0 = System.currentTimeMillis(); bubblesort(a, 0, 19999); long t1 = System.currentTimeMillis(); System.out.println(t1-t0); のようにして、ソーティングにかかる時間を 計測してみよ。

古典的な教科書 データ構造とアルゴリズム 基本的なデータ構造とそのアルゴリズム ソート アルゴリズムの解析法 アルゴリズムの設計法 A.V.エイホ・J.E.ホップクロフト・J.D.ウルマン著 大野義夫訳 培風館 基本的なデータ構造とそのアルゴリズム ソート アルゴリズムの解析法 アルゴリズムの設計法

基本的なデータ構造 リスト、スタック、待ち行列、写像 木 集合を表現するデータ構造 有向グラフ 無向グラフ 2分木 辞書 ハッシュ表 優先度つき待ち行列、2分探索木 トライ、平衡木、MFSET 有向グラフ 無向グラフ

基本的なアルゴリズム 有向グラフ 無向グラフ ソート 最短経路問題 強成分 コスト最小の極大木 関節点と二重連結成分 グラフのマッチング クイックソート、ヒープソート ビンソート、基数ソート 比較によるソートの下限

アルゴリズムの設計法 分割統治アルゴリズム 動的計画法(ダイナミックプログラミング) 欲ばりアルゴリズム バックトラッキング ワールドシリーズの賭け率 三角形分割問題 欲ばりアルゴリズム 巡回セールスマン問題 バックトラッキング ゲームの木・巡回セールスマン問題 局所的な探索アルゴリズム 最小コストの極大木・巡回セールスマン問題

より新しい教科書 Introduction to Algorithms Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest The MIT Press and McGraw-Hill Book Company, 1989

C言語を対象とした教科書 Cプログラマのための アルゴリズムと データ構造 近藤嘉雪【著】 SOFT BANK Publishing 具体的なプログラムが豊富。

演習 選択ソートおよびバブルソートに対して、配列を大きくして、時間計算量を実測してみよ。 クイックソートの計算量について考察せよ。 クイックソートのプログラムに、既にソート済みの配列を与えた場合、時間計算量はどのようになるか。 ⇒ 計算量の回