• 検索結果がありません。

データ構造とアルゴリズム ( 第 5 回 )

N/A
N/A
Protected

Academic year: 2021

シェア "データ構造とアルゴリズム ( 第 5 回 )"

Copied!
33
0
0

読み込み中.... (全文を見る)

全文

(1)

データ構造とアルゴリズム ( 第 5 回 )

静岡大学工学部 安藤和敏

2007.12.13

(2)

第 4 章データの探索

4.1

探索の定義と簡単な探索アルゴリズ

4.2 2

分探索法

4.3

ハッシュ法

(3)

第 4 章データの探索

4.1

探索の定義と簡単な探索アルゴリズ

4.2 2

分探索法

4.3

ハッシュ法

(4)

定義 4.1 (探索)

探索とは,入力として n 個のデータ d0, d1, ...

, dn-1 と値 x が与えられたときに,データ中 から x = di となる di をみつける操作である

探索する値がデータの中に存在しないときは,

“ データ中に存在しない”という出力を行う.

(5)

日常生活における探索の例

n 個のデータ d0, d1, ... , dn-1 :辞書に載っているすべての 単語

探索する値 x :調べたい単語

n 個のデータ d0, d1, ... , dn-1 :オークションに出品されて いるすべての商品名

探索する値 x :欲しい物の商品名 辞書

インターネット・オークション

(6)

簡単な探索アルゴリズム

以降では,与えられる n 個のデータ d0, d1, ... , dn-1 ,および,探索する値 x は,すべて正の整数 であると仮定する.

(7)

アルゴリズム 4.1 (線形探索)

入力: n 個のデータを格納する配列 D と探索す る値 x

i = 0;

while (i < n) { if (x == D[i]) {

D[i] を出力してアルゴリズムを終了 ;

} else { i = i + 1;

}

(8)

アルゴリズム

4.1

の実行例

17 39 1

D 5

[0] [1] [2] [3] [4]

9 24 2 11

[5] [6] [7]

23 6 13 [8] [9] [10]

29 28 20 [11] [12][13]

33 [14][15]

15

(9)

アルゴリズム 4.1 の時間計算量

17 39 1

D 5

[0] [1] [2] [3] [4]

9 24 2 11

[5] [6] [7]

23 6 13 [8] [9] [10]

29 28 20 [11] [12][13]

33 [14][15]

15

最良時間計算量は O(1) 最悪時間計算量は O(n) 平均時間計算量は O(n)

(10)

第 4 章データの探索

4.1

探索の定義と簡単な探索アルゴリズ

4.2 2

分探索法

4.3

ハッシュ法

(11)

2

分探索法

D[0] < D[1] < D[2] < ... < D[n-1].

入力データが昇順に(小さい順)に,配列 D に格納 されていると仮定する :

(12)

2

分探索法(1)

探索する値 x と配列の中央にあるデータと比較する.

D

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10][11] [12][13][14][15]

x と比較す

(13)

2

分探索法(2)

中央のデータと x が等しい場合,そのデータを出力して 探索を終了する.

D

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10][11] [12][13][14][15]

D[7] == x の場合

(14)

2

分探索法(2)

中央のデータが x より小さい場合, x は中央

D

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10][11] [12][13][14][15]

D[7] < x の場合

(15)

2

分探索法(3)

中央のデータが x より大きい場合, x は中央 のデータより右側にはないので,探索範囲を

D

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10][11] [12][13][14][15]

x < D[7] の場合

(16)

2 分探索法の実行例 (x=23)

1 2 5

D 9

[0] [1] [2] [3] [4]

6 11 13 15

[5] [6] [7]

17 20 23 [8] [9] [10]

24 28 29 [11] [12][13]

39 [14][15]

33 D[7] < 23

(17)

2 分探索法の実行例 (x=23)

1 2 5

D 9

[0] [1] [2] [3] [4]

6 11 13 15

[5] [6] [7]

17 20 23 [8] [9] [10]

24 28 29 [11] [12][13]

39 [14][15]

33 23 < D[11]

(18)

2 分探索法の実行例 (x=23)

1 2 5

D 9

[0] [1] [2] [3] [4]

6 11 13 15

[5] [6] [7]

17 20 23 [8] [9] [10]

24 28 29 [11] [12][13]

39 [14][15]

33 D[9] < 23

(19)

2 分探索法の実行例 (x=23)

1 2 5

D 9

[0] [1] [2] [3] [4]

6 11 13 15

[5] [6] [7]

17 20 23 [8] [9] [10]

24 28 29 [11] [12][13]

39 [14][15]

33 D[9] == 23

(20)

2

分探索法の実現(アルゴリズム

4.2

入力 : n 個の昇順データを格納する配列 D と探索する値 x

left = 0; right = n -1; mid = (left + right)/2;

while (left < right) {

if (D[mid] == x) { D[mid] を出力しアルゴリズムを終了 ; } else if (D[mid] < x) { left = mid + 1; }

else { right = mid -1; } mid = (left + right) /2;

(21)

アルゴリズム

1.3

の動き

1 回目

1 2 5

D 6 9 11 13 15 17 20 23 24 28 29 33 39

1 2 5

D 6 9 11 13 15 17 20 23 24 28 29 33 39

1 2 5

D 6 9 11 13 15 17 20 23 24 28 29 33 39

2 回目

3 回目

4 回目

(22)

2分探索法の時間計算量

調べる配列の大きさは, while の繰り返しごとに

,半分以下になる.したがって, k 回目の while の繰り返しを実行したときに,配列の大きさは

以下になる.

n

k

 

 

 2 1

(23)

2分探索法の時間計算量(続き)

したがって,アルゴリズムが終了するまでの

while 文の繰返し回数 k

を満たす.

2 1

1   

 

n

k

n  2

k

上式を書き換えると,      であるから,

k n  log

を得る.

(24)

第 4 章データの探索

4.1

探索の定義と簡単な探索アルゴリズ

4.2 2

分探索法

4.3

ハッシュ法

(25)

ハッシュ法のアイデア

データを格納するおおまかな場所を,そのデータ がもつ情報から決定する.

403だから4階 だな

(26)

ハッシュ関数

データ x から,そのデータを格納する大まかな場 所を決定する関数をハッシュ関数呼んで, hash(x) と表す.

例)

x   ----> hash(x) = (x の左端の数字)

(27)

データを格納するための配列 H

データを格納する場所として,配列 H を準備する

ハッシュ法で用いる配列のサイズは格納するデー タのサイズ n 1.5 2 倍とするのが一般的で ある.

ここでは, H のサイズは, 1.5n としておく.

(28)

ハッシュ法によるデータの格納 の例

hash(x) = (x 24 で割った余り) = x%24 データの集合

{17, 39, 1, 9, 5,24, 2, 11, 23, 6, 13, 29, 28, 20, 15, 33}

を考える.( n=16)

データを格納するための配列 H のサイズは 16×1.5 =24

(29)

 

 

(30)

アルゴリズム

4.3

(ハッシュ法に よるデータの格納)

入力:サイズ m H ,および, n 個のデータ を格納する配列 D

for (i=0; i<n; i = i+1) { k = hash(D[i]);

while (H[k] にデータが格納されている ) {

k = (k+1) m で割った余り ;

(31)

アルゴリズム

4.4

(ハッシュ法に よる探索)

入力:アルゴリズム 4.3 によりデータの格納さ れた配列 H と探索する値 x

k = hash(x);

while (H[k] にデータが格納されている ) {

if (H[k] == x) {

H[k] を出力してアルゴリズムを終了 ;

}

k=((k+1) m で割ったあまり ;

(32)

宿題

4 章の演習問題の全て.(提出しなくてもよい

.巻末の解答例を見て自己採点せよ.)

(33)

お知らせ

2007 12 20 ( 木)のこの時間帯に中間試験 を行う.詳細は Web ページ

http://coconut.sys.eng.shizuoka.ac.jp/algo/07/

に掲載予定です.

参照

関連したドキュメント

90 【基礎課題 7-2】 作成したら動作を確認してください。 「radiobutton2.jsp」に接続し、例えば女

木構造 ルートノード 末端ノード エッジ ノード ルートとそれ以外の ノードにちょうど1つだけ

関数 printset からは、 main 関数のブロック内だけで有効な. 配列変数

[r]

本の山

 アルゴリズムとデータ構造 I,II で学んだ事柄の 発展的な内容を扱う.. 

 アルゴリズムとデータ構造 I,II で学んだ事柄の 発展的な内容を扱う.. 

使用回数 多い場合にはオーダーに注意 入力サイズ 大きい場合にはオーダーに注意 保守 保守が必要なら読みやすさ優先