データ構造と アルゴリズム 第八回 知能情報学部 新田直也.

Slides:



Advertisements
Similar presentations
アルゴリズムイントロダクション第2章 主にソートに関して
Advertisements

4.ソート 4-1.ソート問題について 4-2.簡単なソートアルゴリズム 4-3.高度なソートアルゴリズム
アルゴリズムとデータ構造 2012年6月27日
第11回 整列 ~ シェルソート,クイックソート ~
アルゴリズムとデータ構造 2013年6月18日
アルゴリズムとデータ構造1 2005年7月8日
第8講: 平成19年11月9日 (金) 4限 E252教室 探索アルゴリズム(1).
データ構造とアルゴリズム論 第6章 探索のアルゴリズム
2009/10/9 良いアルゴリズムとは 第2講: 平成21年10月9日 (金) 4限 E252教室 コンピュータアルゴリズム.
第10回 ソート(1):単純なソートアルゴリズム
アルゴリズムとデータ構造 2012年6月14日
情報工学概論 (アルゴリズムとデータ構造)
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造 第3回基本的なデータ構造(リスト) 2015/10/28 アルゴリズムとデータ構造 2015.
データ構造とアルゴリズム 分割統治 ~ マージソート~.
岩井 儀雄 コンピュータ基礎演習  ー探索、整列ー 岩井 儀雄
データ構造とアルゴリズム論 第6章 探索のアルゴリズム
アルゴリズムとデータ構造 2011年6月14日
データ構造と アルゴリズム 第十一回 理工学部 情報システム工学科 新田直也.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
アルゴリズム入門.
第13回 ハッシュテーブルを使ったプログラム ~高速に検索するには?~.
二分探索木によるサーチ.
データ構造とプログラミング技法 (第2回) ー線形構造ー.
算法数理工学 第3回 定兼 邦彦.
ハッシュテーブル.
データ構造とアルゴリズム (第2回) ー線形構造ー.
アルゴリズムとデータ構造1 2006年7月4日
アルゴリズムとデータ構造1 2006年6月16日
アルゴリズムとデータ構造1 2005年7月15日
アルゴリズムとデータ構造 補足資料14-2 「ダイレクトチェイニング法」
オブジェクト指向 プログラミング 第七回 知能情報学部 新田直也.
アルゴリズム入門.
第9回 優先度つき待ち行列,ヒープ,二分探索木
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
データ構造と アルゴリズム 第七回 知能情報学部 新田直也.
データ構造と アルゴリズム 第六回 知能情報学部 新田直也.
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
Cプログラミング演習 第10回 二分探索木.
アルゴリズムとデータ構造1 2009年7月9日
アルゴリズムとデータ構造1 2005年7月5日
プログラミング 4 整列アルゴリズム.
2005年度 データ構造とアルゴリズム 第6回 「ハッシュ法を用いた探索」
2009/10/23 整列アルゴリズム (1) 第4講: 平成21年10月23日 (金) 4限 E252教室 コンピュータアルゴリズム.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
プログラミング 4 探索と計算量.
プログラミング 4 木構造とヒープ.
簡易データベース 情報画像工学実験 I : 実験2 担当:関屋大雄(工学部1号棟515室)
アルゴリズムとデータ構造1 2006年7月11日
アルゴリズムとデータ構造 2011年6月23日
データ構造とアルゴリズム 第11回 リスト構造(1)
5.サーチ 5-1.線形探索 5-2.2分探索 5-3.ハッシュ.
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
第9回 優先度つき待ち行列,ヒープ,二分探索木
アルゴリズムとデータ構造 2012年7月2日
コレクション・フレームワーク J2EE I (データベース論) 第6回 /
コレクション・フレームワーク データベース論 第7回.
アルゴリズムとデータ構造 2011年6月28日
アルゴリズムとデータ構造1 2006年6月23日
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造1 2009年7月2日
アルゴリズムとデータ構造 補足資料11-3 「線形リストのオペレータ」
アルゴリズムとデータ構造 2012年6月25日
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
データ構造と アルゴリズムI 第三回 知能情報学部 新田直也.
アルゴリズムとデータ構造1 2005年7月12日
アルゴリズムとデータ構造1 2007年7月6日
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
TList リスト構造とは? 複数のデータを扱うために、 データの内容と、次のデータへのポインタを持つ構造体を使う。
Presentation transcript:

データ構造と アルゴリズム 第八回 知能情報学部 新田直也

探索 探索: 表からデータを探し出す. 名前 点数 Eric 90 Tomas 50 Frederic 80 Mary 95 John 35

「表」抽象データ型(1) 表: 順序を持たない. キーとデータの対応関係. キーは重複しない. リストとの違いに注意. 順不同 キー データ 名前 点数 Eric 90 Tomas 50 Frederic 80 Mary 95 John 35 順不同 レコード

「表」抽象データ型(2) 表に必要な操作: 登録 インタフェース 削除 探索 名前 点数 Eric 90 Tomas 50 Frederic 80 Mary 95 John 35 インタフェース 削除 探索

線形探索(登録) 表のデータ構造: 配列 登録のアルゴリズム: 最後に追加するだけ. struct Record { int key; // 重複しない int data; // 0以上と仮定 }; struct Record table[100]; int n = 0; // レコード数(<= 100) void add(int key, int data) { if (n < 100) { table[n].key = key; table[n].data = data; n++; }

線形探索(探索) 探索アルゴリズム: 先頭から順番に… int search(int key) { int i; for (i = 0; i < n; i++) { if (table[i].key == key) return table[i].data; } return -1;

線形探索の最悪時間計算量 レコード数 n を入力のサイズとする. 探索アルゴリズムをもっと早くできないか… 登録アルゴリズム: O(1) 探索アルゴリズム: O(n) 探索アルゴリズムをもっと早くできないか…

二分探索(1) 表のデータ構造: 配列(キーでソート済み) 探索のアルゴリズム: 候補を半分づつ絞っていく… key 1 3 4 8 13 14 18 20 21 25 key 1 3 4 8 13 14 18 20 21 25 key 1 3 4 8 13 14 18 20 21 25 middle → < 14 (key) middle → middle → > 14 (key)

二分探索(2) 二分探索のプログラム: int binary_search(int key) { int low, high, middle; low = 0; high = n – 1; while (low <= high) { middle = (low + high) / 2; if (key == table[middle].key) return table[middle].data; else if (key < table[middle].key) high = middle - 1; else low = middle + 1; } return -1;

二分探索(3) 二分探索のプログラム(再帰型): int binary_search(int key) { return binary_search_sub(0, n-1, key); } int binary_search_sub(int low, int high , int key) { if (low > high) return -1; middle = (low + high) / 2; if (key == table[middle].key) return table[middle].data; else (key < table[middle].key) return binary_search_sub(low, middle – 1, key); else return binary_search_sub(middle + 1, high, key);

二分探索(4) 二分探索の時間計算量 1回のループでデータ量が半分になる. →最悪でも,log2n 回のループ 1回のループはたかだか4ステップ O(1) × O(log n) = O(log n) →線形探索より速い!!

二分探索(5) 登録のアルゴリズム: データは常にソートされている必要がある. →挿入位置を探す必要. →挿入位置の後ろのデータをずらす必要. 挿入位置は二分探索で可能. int add_binary(int key, int data) { int pos; pos = データを挿入すべき位置; 配列中のpos以降の要素を1つづつ後ろにずらす; table[pos].key = key; table[pos].data = data; } O(log n) O(n) O(1)

線形探索法と二分探索法の比較 登録 探索 線形探索法 O(1) O(n) 二分探索法 O(log n)

二分探索の高速化 登録が遅い原因 データをずらすのに時間がかかっている. 線形リストを使えないか? struct Record { int key; int data; struct Record *next; };

簡単には高速化できない 線形リストではmiddleの位置を探すのに時間がかかる. (双方向リストでも同様) low middle high … …