Microsoft PowerPoint - 05.pptx

Similar documents
Microsoft PowerPoint - 06.pptx

Taro-2分探索木Ⅱ(公開版).jtd

memo

Microsoft PowerPoint - kougi10.ppt

Microsoft Word - no206.docx

Taro-リストⅠ(公開版).jtd

memo

PowerPoint Presentation

PowerPoint Template

Taro-2分探索木Ⅰ(公開版).jtd

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

Microsoft PowerPoint - algo ppt [互換モード]

Microsoft PowerPoint - 7.pptx

Taro-リストⅢ(公開版).jtd

memo

プログラミングI第10回

始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル

Microsoft PowerPoint - algo ppt [互換モード]

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

PowerPoint プレゼンテーション

Microsoft PowerPoint - kougi11.ppt

データ構造

第2回

PowerPoint プレゼンテーション

memo

Microsoft Word - 13

memo

Microsoft Word - 第5回 基本データ構造2(連結リスト).doc

Microsoft PowerPoint - 6.pptx

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

情報処理Ⅰ

Microsoft PowerPoint - kougi9.ppt

alg2015-6r3.ppt

Microsoft Word - no12.doc

PowerPoint プレゼンテーション

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

Taro-最大値探索法の開発(公開版

第3回 配列とリスト

Microsoft Word - NonGenTree.doc

alg2015-3r3.ppt

[Problem F] 古い記憶 良さそうな方法は思いつかなかった アイディア募集中!!! かなり強引に解いている 各判定データに対して 30 秒程度かかる 元の文章と改ざん文章の関係を考える ウィルス感染の可能性は高々 2 回であり 各々の感染では 1 文字削除 1 文字追加 1 文字変更が行われ

PowerPoint Presentation

PowerPoint Presentation

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

アルゴリズムとデータ構造

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

Taro-スタック(公開版).jtd

Microsoft Word - no205.docx

Taro-再帰関数Ⅲ(公開版).jtd

2. データ構造ヒープに保存するデータは 番号付けられて保存される 従って リスト L として保存することとする 3. アルゴリズム 3.1. 要素の追加新しい要素の追加は リストの終端に置くことで開始する つまり 最下層の一番右 または新たに最下層を生成してその一番左となる この後 この要素を正し

1. はじめに 二分木ヒープ 様々なアルゴリズムにおいて ある要素の集合またはリストから 最小 な要素を取り 出す必要がある そのような場合に使われる標準的データ構造が二分木ヒープ (binary heap) である あるオブジェクトO を考える そのオブジェクトは ラベル O. label と値

Microsoft Word - 中間試験 その1_解答例.doc

program7app.ppt

Microsoft PowerPoint - ca ppt [互換モード]

プログラム言語及び演習Ⅲ

第2回

PowerPoint プレゼンテーション

Quick Sort 計算機アルゴリズム特論 :2017 年度 只木進一

Microsoft PowerPoint - Pro110111

PowerPoint Presentation

Microsoft Word - 3new.doc

Microsoft PowerPoint - ad11-09.pptx

模擬試験問題(第1章~第3章)

PG13-6S

Microsoft PowerPoint - 06graph3.ppt [互換モード]

文字数は1~6なので 同じ本数の枝を持つパスで生成される呪文の長さは最大で6 倍の差がある 例えば 上図のようなケースを考える 1サイクル終了した時点では スター節点のところに最強呪文として aaaaaac が求まる しかしながら サイクルを繰り返していくと やがてスター節点のところに aaaaaa

memo

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

alg2015-4r2.ppt

プログラミング基礎

r07.dvi

文字列操作と正規表現

ohp07.dvi

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

Prog1_10th

Microsoft PowerPoint - lec10.ppt

Microsoft PowerPoint - H20第10回最短経路問題-掲示用.ppt

Microsoft PowerPoint - 13approx.pptx

株式会社アルウィン C 言語コーディング規約 ver.0.1

Taro-cshプログラミングの応用.jt

INTRODUCTION TO ALGORITHMS

Microsoft Word - 12

Microsoft PowerPoint - 10.pptx

第12回:木構造

二分木の実装

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

Taro-再帰関数Ⅱ(公開版).jtd

Microsoft PowerPoint - ProD0107.ppt

ープのロープ長以下であれば実現可能である ケース 3: 3 本のロープの杭の位置を点 P 1 = (x 1, y 1, 0), 点 P 2 = (x 2, y 2, 0), 点 P 3 = (x 3, y 3, 0) とする 点 P 1 = (x 1, y 1, 0), 点 P 2 = (x 2,

2018年度「プログラミング言語」配布資料 (12)

Microsoft PowerPoint - ca ppt [互換モード]

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

4 分岐処理と繰返し処理 ( 教科書 P.32) プログラムの基本的処理は三つある. (1) 順次処理 : 上から下に順番に処理する ぶんきそろ (2) 分岐処理 : 条件が揃えば, 処理する はんぷく (3) 反復処理 : 条件が揃うまで処理を繰り返す 全てのプログラムは (1) から (3) の

概要 プログラミング論 構造体 構造体 複数の変数を組合わせて, ひとまとめにしたもの 簡単 重要 自己参照型, リスト 重要, 難しい S-1 S-2 新しい構造体の宣言 struct 構造体名 { データ型メ

自己紹介 ( 専門分野 ) プログラミング言語の研究 特に基礎理論 研究の出発点 : 自分がうまくプログラムが書けないのを言語のせいにする プログラムの間違いを自動発見する仕組みを作る そもそも間違いを犯しにくいプログラミング言語を作る

Microsoft Word - NonGenList.doc

Microsoft PowerPoint - lecture02.pptx

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

Prog1_15th

Transcription:

アルゴリズムとデータ構造第 5 回 : データ構造 (1) 探索問題に対応するデータ構造 担当 : 上原隆平 (uehara) 2015/04/17

アルゴリズムとデータ構造 アルゴリズム : 問題を解く手順を記述 データ構造 : データや計算の途中結果を蓄える形式 計算の効率に大きく影響を与える 例 : 配列 連結リスト スタック キュー 優先順位付きキュー 木構造 今回と次回で探索問題を例に説明

配列 一方向連結リスト 要素の追加 挿入 削除 配列と連結リスト

配列 : アクセスが容易 任意の場所に蓄えられたデータに定数時間でアクセスできる ( ランダムアクセス性 ) cf. 先頭からしかアクセスできないデータ構造 i 番目の要素のアクセスには ci 時間かかる e.g., 連結リスト インデックス順にアクセスするのも容易 ( シーケンシャルアクセス性 ) cf. データがインデックス順ではない順序で蓄えられるデータ構造 e.g., ランダム木

連結リスト (linked list) 前後の要素の場所を明示的に指定 レコードの連なり データ部ポインタ部 データを蓄える部分 : データ部 前後を指す部分 : ポインタ部 バリエーション 1 方向連結リスト 双方向連結リスト 木構造も表現可能 データ部ポインタ部データ部ポインタ部データ部ポインタ部データ部ポインタ部データ部ポインタ部データ部ポインタ部

一方向連結リスト レコードの連なり データ部 : データを蓄える ポインタ部 : 次のレコードを指すポインタを蓄える typedef struct{ データ部 int data; struct list_t *next; ポインタ部 } list_t; list_t *new_r; new_r = (list_t *) malloc(sizeof(list_t));

例 : 多数のデータを 一方向連結リストに蓄える 基本 : レコード r を作る r のデータ部にデータ x を入れる r をリストに連結する head 新たなレコード r head x 連結先 : 先頭か末尾

一方向連結リストの先頭に新しいレコードを連結するプログラム list_t *head, *new_r; int x; head = NULL; while(/* 入力データがある */){ new_r = (list_t *) malloc(sizeof(list_t)); new_r >data = x; new_r >next = head; head = new_r; } 新しいレコードは先頭に head head 入力順と逆順に蓄えられる 1 2 13 head head 3 4 21 13 33 21 13

一方向連結リストの末尾に新しい list_t *head, *new_r, *tail; int x = /*some value*/; new_r =(list_t *) malloc(sizeof(list_t)); new_r >data = x; new_r >next = NULL; head = new_r; tail = new_r; while(/* 蓄えるデータがある */){ x=/* next data */; new_r =(list_t *) } レコードを連結するプログラム malloc(sizeof(list_t)); new_r >data = x; tail >next = new_r; new_r >next = NULL; tail = new_r; 末尾のレコードを指すポインタ 末尾を新しいレコードへのポインタに

連結リストの利点 ( 配列と比較 ): データの挿入が容易 データの移動なし ( 多数の ) データを移動する head head 必要がある 1 2 3 1 4 2 3 挿入 ポインタ部の値を入れ替えるだけ 挿入場所以降のデータを移動

一方向連結リスト : データの挿入 xをデータ部に含むレコードrを作る rのポインタ部にポインタpで示されるレコードのnextポインタの値 p >nextを代入 pのポインタがxを含むレコードを指すようにセット head head new_r = (list_t *) malloc( sizeof(list_t) ); new_r >data = x; new_r >next = p >next; p >next = new_r p p r

一方向連結リスト : データの削除 ポインタ p が指すレコードの削除 p >data = p >next >data p >next = p >next >next head p x head p x 削除 p が指すレコードを削除する代わりに,p の次のレコードを削除 ( 削除する前に,p のデータを移しておく )

逐次探索法 mブロック法 2 重 mブロック法 2 分探索法 連結リストの応用 : それぞれの探索法に対応するデータ構造

typedef struct{ double data; struct list_t *next; } list_t; p = head; while(p!= NULL && p >data!= x) p = p >next; return p; 逐次探索法に対応する データ構造 先頭からデータ x に等しいデータが含まれているかどうか探索 含まれている 含んでいるレコードのアドレス 含まれていない NULL これでいいの? 満たされている? YES YES 脱出時は p==null または p >data == x

逐次探索法 mブロック法 2 重 mブロック法 2 分探索法 それぞれの探索法に対応するデータ構造

m ブロック法 (0) ソートされた配列全体を m 個のブロック B 0, B 1,..., B m 1 に分割. (1) 各ブロックの最大値と比較することにより, 質問 x を含みうるブロック B j を求める. (2) ブロック B j の中を逐次探索する.

m ブロック法 (0) ソートされた配列全体を m 個のブロック B 0, B 1,..., B m 1 に分割. (1) 各ブロックの最大値と比較することにより, 質問 x を含みうるブロック B j を求める. (2) ブロック B j の中を逐次探索する. 最も簡単な実現方法は, 各ブロックの長さを同じにすること. ただし, 最後のブロックだけは長さが異なる. 0 n/m 2n/m n-1 ブロック 0 ブロック 1 ブロック 2 ブロック m-1 ブロック長を k とすると k = ceil(n/m) ブロック B j は配列の jk 番目から (j+1)k-1 番目 : B j = [jk, (j+1)k-1]

m ブロック法 (0) ソートされた配列全体を m 個のブロック B 0, B 1,..., B m 1 に分割. (1) 各ブロックの最大値と比較することにより, 質問 x を含みうるブロック B j を求める. (2) ブロック B j の中を逐次探索する. j=0; while(j<=m 2) if x<=s[(j+1)*k 1] then ループから出る else j=j+1; 途中でループを出たときはそのときの j の値がブロックを指す そうでないときは最後のブロックが対象となる

m ブロック法 (0) ソートされた配列全体を m 個のブロック B 0, B 1,..., B m 1 に分割. (1) 各ブロックの最大値と比較することにより, 質問 x を含みうるブロック B j を求める. (2) ブロック B j の中を逐次探索する. i=j*k; t = min{ (j+1)*k 1, n 1 }; while( i < t ) if x<=s[i] then ループから出る ; else i=i+1; // ブロック内の次の要素へ if x = s[i] then i を返して終了 ; else 1 を返して終了 ;

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 s 3 4 6 7 9 11 14 15 17 18 20 23 24 26 27 29 30 32 x=20 探索例と計算時間 比較回数 ブロック数 + ブロック = m + n/m m + n/m を最小にする m の値は? f(m) = m + n/m とおいて,m に関して偏微分する f (m) = 1 n/m 2 = 0 m = n m = n のとき, 比較回数 n + n/ n = 2 n よって, 時間複雑度は O( n)

m ブロック法に対応する データ構造 レコードに高さの概念を導入 height==1 ブロック ブロックの最大値 height==0 最初は上の pointer をたどって, どのブロックが質問要素を含み得るかを調べる. 次に下の pointer をたどってブロック内を逐次調べる. typedef struct{ int data; int height; struct mlist_t **next; }mlist_t; next[0]: block 内の次へ, next[1]: 次の block へ

逐次探索法 mブロック法 2 重 mブロック法 2 分探索法 それぞれの探索法に対応するデータ構造

2 重 m ブロック法 m ブロック法では ブロック内の探索に逐次探索を利用ブロック内も同じ方法で探索 二重 m ブロック法の原理 探索区間を m 個のブロックに分割し x を含むブロックに対して 同じ探索を再帰的に適用 これを ブロック長が定数 N 以下になるまで行なう

探索例 : 20 を探す (x=20) ブロック数を 3 とした場合 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 s 3 4 6 7 9 11 14 15 17 18 20 23 24 26 27 29 30 32 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 s 3 4 6 7 9 11 14 15 17 18 20 23 24 26 27 29 30 32 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 s 3 4 6 7 9 11 14 15 17 18 20 23 24 26 27 29 30 32

p = head; 2 重 mブロック法に対応するデータ構 for(i = MAX_H 1; i >= 0; i ) while( 造 (p >next[i]) >data < x) p = p >next[i]; 各レコードは様々な高さを持つ p = p >next[0]; cf. m ブロック法では {0,1} の 2 種類 順次高さを下げて探索 return p >data==x?p:null; typedef struct{ int data; int height; struct mlist_t **next; } mlist_t; next[i] は高さiのポインタ (0 i height<max_h)

逐次探索法 mブロック法 2 重 mブロック法 2 分探索法 それぞれの探索法に対応するデータ構造

2 分探索法 ソートされた探索空間を二つに分けて探索 78を見つける 5を見つける 33より小さい 33より大きい 2 5 6 19 33 54 67 72 78 2 5 6 19 54 67 72 78 6 より小さい 72 より大きい 2 5 78 発見! 発見! 分けるポイントはだいたい真ん中にすると良い

2 5 6 19 33 54 67 72 78 2 分探索法 2 5 6 19 2 5 探索範囲 [left, right] の中央の値 s[mid] と探したい値を比較 x > 中央の値 探索を右半分に限定できる left = mid+1; rightは同じ x < 中央の値 探索を左半分に限定できる leftは同じ,right = mid 1 x = 中央の値 見つかった 以上を探索範囲がなくなるまで繰り返す

2 分探索法に対応する データ構造 : 2 分探索木 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 s 10 12 18 28 30 38 40 45 47 49 53 67 70 75 82 7 45 3 11 28 67 1 5 9 13 12 38 49 75 0 2 4 6 8 10 12 14 10 18 30 40 47 53 70 82 データサイズ n が固定されていれば, 予め中央の位置が計算できる

左部分木すべて 45 以下 2 分探索木の性質 7 45 3 11 28 67 1 5 9 13 12 38 49 75 0 2 4 6 8 10 12 14 10 18 30 40 47 53 70 82 あるノード n について 右の子部分木に現れる値は n の値よりも大きい 左の子部分木に現れる値は n の値よりも小さい 右部分木すべて 45 以上

2 分探索木における探索 BSTnode *root, *v; x=/*some value*/; v = root; while( v ){ if(v >data == x) break; if(v >data > x) v = v >lson; else v = v >rson; } return v; 小さければ左 大きければ右 typedef struct{ int data; struct BSTnode *lson, *rson; }BSTnode; 各レコードで左の子へのポインタと右の子へのポインタをもつ

ミニ演習 を証明せよ p = 21, q = 4, r = 2014 の場合 p, q, r が全て正の場合 そうとは限らない場合 を証明せよ ( どちらも集合であるとみなして解くこと )