酒居敬一(sakai.keiichi@kochi-tech.ac.jp) アルゴリズムとデータ構造1 2006年6月16日 酒居敬一(sakai.keiichi@kochi-tech.ac.jp) http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/ALG/2006/index.html.

Slides:



Advertisements
Similar presentations
アルゴリズムとデータ構造 第2回 線形リスト(復習).
Advertisements

アルゴリズムとデータ構造 2012年6月27日
アルゴリズムとデータ構造1 2008年7月22日
第11回 整列 ~ シェルソート,クイックソート ~
アルゴリズムとデータ構造 2013年6月18日
アルゴリズムとデータ構造1 2005年7月8日
アルゴリズムとデータ構造 2010年7月5日
データ構造とプログラミング技法 (第8回) ーデータの探索ー.
2009/10/9 良いアルゴリズムとは 第2講: 平成21年10月9日 (金) 4限 E252教室 コンピュータアルゴリズム.
第10回 ソート(1):単純なソートアルゴリズム
アルゴリズムとデータ構造 2012年6月14日
オペレーティングシステムJ/K 2004年11月4日
アルゴリズムとデータ構造 2011年6月13日
データ構造とアルゴリズム 分割統治 ~ マージソート~.
アルゴリズムとデータ構造1 2009年6月18日
アルゴリズムとデータ構造 2011年6月9日
①データ構造 ②アルゴリズム ③プログラム言語 ④マークアップ言語
データ構造と アルゴリズム 第八回 知能情報学部 新田直也.
アルゴリズムとデータ構造 2011年6月14日
アルゴリズムとデータ構造 2011年6月20日
データ構造と アルゴリズム 第十一回 理工学部 情報システム工学科 新田直也.
第11回 整列 ~ シェルソート,クイックソート ~
アルゴリズムとデータ構造 2013年6月10日
プログラミング基礎a 第8回 プログラムの設計 アルゴリズムとデータ構造
第13回 ハッシュテーブルを使ったプログラム ~高速に検索するには?~.
二分探索木によるサーチ.
アルゴリズムとデータ構造 2012年6月28日
アルゴリズムとデータ構造 2011年6月27日
アルゴリズムとデータ構造1 2005年7月26日
アルゴリズムとデータ構造1 2006年7月4日
アルゴリズムとデータ構造1 2005年7月15日
コンパイラ 2012年11月15日
アルゴリズムとデータ構造 2010年6月18日
第5回放送授業.
データ構造と アルゴリズム 第六回 知能情報学部 新田直也.
Cプログラミング演習 第10回 二分探索木.
アルゴリズムとデータ構造1 2009年7月9日
アルゴリズムとデータ構造1 2005年7月5日
復習その1+α JBuilderの使い方を思い出す。 配列とGUI
プログラミング基礎a 第8回 プログラムの設計 アルゴリズムとデータ構造
プログラミング 4 整列アルゴリズム.
アルゴリズムとデータ構造1 2005年6月24日
2009/10/23 整列アルゴリズム (1) 第4講: 平成21年10月23日 (金) 4限 E252教室 コンピュータアルゴリズム.
アルゴリズムとデータ構造 2010年7月26日
プログラミング 4 木構造とヒープ.
コンパイラ 2011年10月20日
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
アルゴリズムとデータ構造1 2006年7月11日
アルゴリズムとデータ構造 2011年6月23日
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
アルゴリズムとデータ構造1 2006年7月4日
アルゴリズムとデータ構造 2012年7月2日
アルゴリズムとデータ構造 2012年6月11日
アルゴリズムとデータ構造1 2008年7月24日
アルゴリズムとデータ構造 2011年6月28日
アルゴリズムとデータ構造 2011年6月16日
オペレーティングシステムJ/K (管理のためのデータ構造)
アルゴリズムとデータ構造1 2006年6月23日
アルゴリズムとデータ構造 2013年7月1日
アルゴリズムとデータ構造1 2009年7月2日
アルゴリズムとデータ構造 2013年7月2日
アルゴリズムとデータ構造1 2009年6月15日
アルゴリズムとデータ構造 2012年6月25日
アルゴリズムとデータ構造 2013年6月20日
アルゴリズムとデータ構造 2012年6月21日
アルゴリズムとデータ構造 2010年6月17日
アルゴリズムの視覚化 この図は左が大きく、 右が小さくなるようにソートしている  この図は左が大きく、  右が小さくなるようにソートしている
アルゴリズムとデータ構造1 2005年7月12日
アルゴリズムとデータ構造1 2007年7月6日
Presentation transcript:

酒居敬一(sakai.keiichi@kochi-tech.ac.jp) アルゴリズムとデータ構造1 2006年6月16日 酒居敬一(sakai.keiichi@kochi-tech.ac.jp) http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/ALG/2006/index.html

プログラムとアルゴリズム 二分木と言った非線形なデータ構造と,これを扱うアルゴリズム,特に再帰的なアルゴリズムについて学ぶ つぎにハッシュやソートと言った良く利用されるデータ構造やアルゴリズムの概観を得る.

Euclidの互除法(2ページ 1.1) mをnで割って、余りをrとする。 r=0であれば、アルゴリズムは終了する。 このとき、nが最大公約数である。 m←nとする(nの値をmに代入する)。 次にn←rとして1に戻る。 ここでは、次の処理が使われている。 除算 0との比較・分岐処理 変数への代入 繰り返し(ループ)

/* C言語によるgcdの例1 */ int gcd(int m, int n) { int r; 1: r = m % n; if (r == 0) goto 2; m = n; n = r; goto 1; 2: return n; } /* C言語によるgcdの例2 */ int gcd(int m, int n) { int r; while((r = m % n) != 0){ m = n; n = r; } return n; /* Java とほとんど同じ */ プログラムは、連接(文の並び順による評価)・条件分岐(たとえばif文)・繰り返し(例えばwhile文)だけで構成できるとされている。そもそも、gotoを使わないで書いたほうがわかりやすいことも多い。 そのような背景で、Javaのようにgotoを使えないプログラミング言語がある。

簡単なアルゴリズムであればアセンブリ言語でも記述できる。ただし、アルゴリズムが必要とする処理をプロセッサが知っていれば…  スタックフレーム sp+4 sp+2    sp ; アセンブリ言語によるgcd関数の例 .text gcd: mov.w @(2,sp),r1 ; 引数 m mov.w @(4,sp),r0 ; 引数 n 1: divxu.b r0l,r1 xor.b r2h,r2h mov.b r1h,r2l ; r = m % n beq 2f ; if(r == 0) goto 2 mov.w r0,r1 ; m = n mov.w r2,r0 ; n = r bra 1b ; goto 1 2: rts ; return n .end 戻りアドレス 引数n 引数m 簡単なアルゴリズムであればアセンブリ言語でも記述できる。ただし、アルゴリズムが必要とする処理をプロセッサが知っていれば… ちなみに、スタックというデータ構造は、C言語では例のように、さりげなく使われている。

レジスタ変数r2(変数r)が、不要になっている。 再帰呼び出しでは、引数は新しい領域に確保される。新しい領域としては、スタックが使われる。  スタックフレーム sp+4 sp+2    sp ; アセンブリ言語によるgcd関数の例 .text gcd: mov.w @(2,sp),r0 ; m mov.w @(4,sp),r1 ; n beq 1f ; if (n == 0) divxu.b r1l,r0 mov.b r0h,r0l xor r0h,r0h ; m % n push r0 push r1 bsr gcd adds.w #2,sp 1: rts ; return m .end 戻りアドレス 引数n 引数m  bsr直後のスタック sp+10  sp+8  sp+6  sp+4  sp+2     sp 戻りアドレス 引数n 引数m 戻りアドレス 引数n 引数m レジスタ変数r2(変数r)が、不要になっている。 再帰呼び出しでは、引数は新しい領域に確保される。新しい領域としては、スタックが使われる。

木構造 ルートとそれ以外の ノードにちょうど1つだけ の経路しか存在しない ルートノード 末端ノード エッジ ノード

二分木 データ 左 右 各ノードが持てる子 の数が高々2である木 順序木である

二分探索木 二分木を次のルールで作成 親よりも小さい値を持つ子は左 親よりも大きい値を持つ子は右 29 20 32 14 24 30 48 7 19 21 31

ノードの探索 ノード数をNとすると O(log N) の計算量で探索できる 木が偏っているときは 最悪O(N)になるが… 29 31 21 19 7 48 30 24 14 32 20

ハッシュテーブル データ キー1 キー2 キー3 ハッシュ関数

分離連鎖法 連結リスト ハッシュ テーブル

空き番地法 キー ハッシュ 再ハッシュ 再ハッシュ 既にデータが 格納されている ここも既にデータが 格納されている この場所は空なので ここに格納する

空き番地法を用いた場合の削除 キー 削除 削除したい ハッシュ 再ハッシュ 再ハッシュ 削除フラグを格納 同じハッシュ値だけど、これじゃない。 キー ハッシュ 再ハッシュ データは消えてるけど、これでもない。 削除 削除したい 削除フラグ 削除フラグを格納 再ハッシュ これだっ! このデータを 探索したい

整列(ソート) (145ページ以降で詳しく) 配列を使用するソートアルゴリズム 空間計算量はいずれもO(N) バブルソート クイックソート 時間計算量O(N log N) 時間計算量は最悪でもO(N2) 空間計算量はいずれもO(N)

バブルソート > 8 3 > 10 8 > 10 3 < 8 10 > 10 5 < 10 15 > 15 5 < 10 15 > 15 12 < 15 32 > 15 1 > 32 12 > 32 1 > 15 6 > 32 6 < 15 24 > 32 24 整列済み 10 1 8 3 15 5 32 12 6 24 10 8 8 3 10 3 10 5 15 5 15 12 15 1 32 12 32 1 15 6 32 6 24 32 24 入れ替え 入れ替え 入れ替えない 入れ替え 入れ替えない 入れ替え 入れ替えない 入れ替え 入れ替えない 入れ替え 入れ替え 入れ替え 入れ替え 入れ替え 入れ替えない 入れ替え 入れ替え 残りも同様に整列させると… 10 1 8 3 15 5 32 12 6 24

クイックソート 基準値を決定 10 1 8 3 15 5 32 12 6 24 基準値を決定 10 8 3 5 1 6 15 32 12 24 < 10 整列済み 基準値を決定 5 15 < 3 1 8 6 12 32 24 10 5 15 < 3 1 8 6 12 32 24 10 10 1 8 3 15 5 32 12 6 24

クイック ソート 32 24 15 12 10 8 6 5 3 1 5 24 15 12 10 8 6 3 1 < 32 5 15 12 10 8 6 3 1 < 32 24 5 12 10 8 6 3 1 < 15 32 24 5 10 8 6 3 1 < 15 12 32 24 5 8 6 3 1 < 10 15 32 12 24 5 6 3 1 < 10 8 15 32 12 24 5 3 1 < 10 8 15 32 12 6 24 3 1 < 10 8 15 5 32 12 6 24 1 < 10 8 3 15 5 32 12 6 24 10 1 8 3 15 5 32 12 6 24