PowerPoint プレゼンテーション

基本情報技術概論 (第6回)
中間試験
12/9 (水) 5,6限
教室未定
アルゴリズム と データ構造
埼玉大学 理工学研究科
堀山 貴史
1
前回までの復習 (データ構造)

基本的なデータ構造
 配列 (array)
 リスト (list)

その他のデータ構造
 スタック (stack)
 待ち行列 (queue, キュー)
 木 (tree)、2分木 (binary tree)

2分探索木、ヒープ
この後、すぐ
2
前回までの復習 (アルゴリズム)

問題を解決するための、有限ステップからなる手順
(言葉やフローチャートなどで書く)

線形探索 (linear search)
探索キー
70


A[ ]
1 2
1 2
3 4 5 6 7 8 9 10
5 10 35 50 70 100 110 150 …
先頭から順番に調べる
大きさ n の配列の探索時間 (計算量)
O( n )
3
前回までの復習 (アルゴリズム)

A[ ]
1 2
1 2
2分探索 (binary search)
3 4 5 6 7 8 9 10 11 12 13 14 15
5 10 35 50 70 100 110 150 190 191 200 300 400
探索キー
70



ソートされた配列に対し、高速に探索できる
探索範囲の中央を調べる
→ 探索キーとの比較で、探索範囲が半分に
計算量 … O( log n )
4
データ構造:

木
深さ
0…
(tree)
節点 と 辺 (枝 ともいう) からなり
以下の 1、2 を満たすもの
1…
2…
3…
1. すべての節点が連結である
2. サイクルを持たない
葉
先祖
親
この節点から見て
子
根
兄弟
子孫
5
データ構造:


2分木
(binary tree)
___________
各節点の子は、高々2つ
右の子 と 左の子 は、区別する
例) 下の3つは、どれも異なる2分木

完全2分木
… 20 個
… 21 個
… 22 個
6
2分木の実現法

リスト
2
1
4
2
5
深さ 0
5
7
7
配列
A[ ] 1
3
3
4

1
2
3
1
4
5
6
2
7
節点 i の
 左の子 2i
 右の子 2i + 1
 親
i /2
________
7
2分木の節点の順序付け

先行順 (pre order)
 根、左部分木、右部分木

中間順 (in order)
 左部分木、根、右部分木

根
左部分木 右部分木
後行順 (post order)
 左部分木、右部分木、根
___________
8
2分木の節点の順序付け

中間順 : 左部分木、根、右部分木
4
×
2
6
+
1
A
3
(A+B)×(C-D) に対応
-
B
5
C
7
D
9
2分木の節点の順序付け

先行順 : 根、左部分木、右部分木
1
×
2
5
+
3

4
A
×+AB-CD に対応
___________
-
6
B
7
C
D
(ポーランド記法)
後行順 : 左部分木、右部分木、根
7
×
3
6
+
1
A
2
AB+CD-× に対応
___________
-
B
4
C
5
D
(逆ポーランド記法)
11
___________
2分探索木
12
データ構造:
2分探索木
___________

2分木の各節点に、データを格納

節点 v のデータは
(1) v のどの左の子孫よりも大きい
(2) v の 〃 右
〃
小さい
例)
6
3
最小 →
1
10
4
8
12
← 最大
7
13
2分探索木の操作
探索

探索キー
8
6
3
1
10
4
8
12
7

根から出発

探索キー = 節点のキー … 探索成功
探索キー < 節点のキー … 左の部分木へ
探索キー > 節点のキー … 右の部分木へ
14
2分探索木の操作
追加

9 を追加
6
3
1
10
8
4
7
12
9

探索と同様にして、木をたどる

木から飛び出したところに、新しい節点を加える
15
2分探索木の操作
削除

10 を削除
6
3
1
10
4
8
12
7


削除するキーを探索して削除
2分探索木の条件に合うように移動 (子孫も同様)
左部分木の最大値を移動
or 右部分木の最小値を移動
16
練習:

2分探索木
次の2分探索木から要素12を削除したとき、その位置に
別の要素を移動するだけで2分探索木を再構成するには、
削除された要素の位置にどの要素を移動すればよいか。
(H16年度 秋 一部改変)
6
4
23
1
ア. 10
ウ. 14
8
5
12
7
10
3
9
イ. 11
エ. 15
14
11
13
15
17
___________
ヒープ
18
データ構造:
ヒープ
(heap)
___________

完全2分木の各節点に、データを格納

親と子の大小関係をそろえる (ヒープ ソートに利用)


親 > 子 なら、根が最大
親 < 子 なら、根が最小
例)
2分探索木との
9
違いに注意
6
3
7
2
4
1
19
ヒープの操作

探索
最大値は?
7
6
3
5
2
4
1
ヒープ ソート


値を順に追加
最大値を順に取り出す
(最大値を探索 & 削除)
20
ヒープの操作
追加

8 を追加
7
6
3
5
2
4
1
8

ヒープの最後 (深さ最大、左詰め) に新しい節点を追加

ヒープの維持
21
ヒープの操作

削除
7
1
6
3
5
2
4
6
1
3
5
2
4
7 を削除

ヒープの最後を削除する節点に追加移動

ヒープの維持
22
アルゴリズム:

ヒープソート
(heap sort)
ヒープの最大値の取り出し、ヒープの維持を繰り返す
7
1
6
5
6
3
2
4
1
最大値の取り出し
5
6
3
2
4
1 7
最後の葉の移動
3
7
2
4
ヒープの維持
4
6
3
5
5
7
1
2
4
最大値の取り出し
3
5
67
1
2
4
最後の葉の移動
3
1
5
67
2
ヒープの維持
23
アルゴリズム:

ヒープソート
(heap sort)
ヒープの最大値の取り出し、ヒープの維持を繰り返す
7
6
1
5
6
3
2
4
1
最大値の取り出し
計算量 O( 1 )
3
5
7
2
4
ヒープの維持
計算量 O( log n )
n 回 繰り返し
… トータルの計算量
O( n log n )
24
25
ハッシュ法
ハッシュ表
キー値に対して演算を行うことで、
高速なアクセスを実現する
ハッシュ関数
mod 23
ハッシュ値
1234 mod 23
= 15
13
14
15
16
…
キー
1234
…

(hash)
アイデア) キー値が大きな数字で、要素数が少ない
→ キー値を折りたたんで、配列に
例) 名前をキーにした名簿
26
ハッシュ法
(hash)

ハッシュ表が混んでいなくて、
ハッシュ関数が適切なら、衝突の確率は低い
→ O( 1 ) 時間でアクセス可能

衝突 … 異なるキーのハッシュ値が同じになること
キー

ハッシュ関数
ハッシュ値
1234
mod 23
15
15
mod 23
15
衝突時の処理
 チェーン法
 オープンアドレス法
ハッシュ表
1
5
27
28
アルゴリズム:

バブルソート
(隣接交換法)
隣り合うデータを見比べて、大小関係が逆なら交換
小 大
小
が
バ
ラ
大 バ
ラ
20
30
5
10
1
20
30
5
見比べて 1
交換
10
1
20
30
5
10
1
20
5
30
10
20
30
1
5
10
1 確定
20
バ
30
ラ
バ
5
ラ
10
20
1
30
5
10
1
5 確定
20
バ
ラ
30
バ
10
ラ
…
29
アルゴリズム:

n個
バブルソート
(隣接交換法)
計算量
1
20
30
5
10
確定
1
5
20
30
10
1
確定 5
10
20
30
1個目を確定させるのに 2個目
比較が n – 1 回
n–2回
確定
…
1
5
10
20
30
3個目
… n - 1 個目
n–3回 … 1回
全部で O( n2 )
30
アルゴリズム:

マージソート
ソートされた2つの列
→ 1つにマージ(併合)するのは簡単
(各列の先頭を見比べながら、小さい方を取っていく)
5 20 25 50

(併合ソート)
1 10 30 40
1回のマージの実行時間は、要素数に比例
31
アルゴリズム:
マージソート
(併合ソート)
5 25 50 20 30 40 10 1
5 25 50 20
5 25
5
25
5 25
30 40 10 1
50 20
50
20
20 50
30 40
30
40
30 40
分割
10 1
10
log n 段
1
1 10
マージ
log n 段
1 段に O( n ) 時間 → 全部で O( n log n ) 時間
33
アルゴリズム:

番兵付き の 線形探索
ループの中の比較回数を減らす
開始
1→i
K → A(n+1)
Yes
A(i) = K
No
i+1→i
n: 配列の要素数
K: 探索キー
i>n
No
Yes
探索成功
の処理
100
K
70
i
A [1]
30
A [2]
50
A [3]
20
A [4]
70
A [5]
10
…
終了
探索失敗
の処理
n
34
アルゴリズム:

線形探索
(linear search)
配列を先頭から順番に探索する
開始
n: 配列の要素数
K: 探索キー
1→i
i>n
No
n
100
K
70
i
Yes
Yes
A(i) = K
No
i+1→i
探索成功
の処理
30
A [2]
50
A [3]
20
A [4]
70
A [5]
10
…
終了
探索失敗
の処理
A [1]
35
36
「全学向け」 用に、「情報向け」 から
抜いたものを、以下に置く
37
2分木の実現法

リスト
2
1
4
2
5
深さ 0
5
7
7
配列
A[ ] 1
3
3
4

1
2
3
1
4
5
6
2
7
節点 i の
 左の子 2i
 右の子 2i + 1
 親
i /2
________
38
39
練習:

データ構造
データ構造に関する記述のうち、適切なものはどれか。
ア. 2分木は、データ間の関係を階層的に表現する木構造の
一種であり、すべての節が2つの子をもつデータ構造である。
イ. スタックは、最初に格納したデータを最初に取り出す先入れ
先出しのデータ構造である。
ウ. リストは、データ部と次のデータの格納先を指すポインタ部
から構成されるデータ構造である。
エ. 配列は、ポインタの付替えだけでデータの挿入 ・ 削除が
できる構造である。
40
41
42
この教材のご利用について




この文面は、TOKYO
TECH OCW の利用
条件を参考にしました
この教材は、以下に示す利用条件の下で、著作権者にわざわざ許諾を
求めることなく、無償で自由にご利用いただけます。講義、自主学習は
もちろん、翻訳、改変、再配布等を含めて自由にご利用ください。
非商業利用に限定

この教材は、翻訳や改変等を加えたものも含めて、著作権者の許
諾を受けずに商業目的で利用することは、許可されていません。
著作権の帰属

この教材および教材中の図の著作権は、次ページ以降に示す著
作者に帰属します。この教材、または翻訳や改変等を加えたもの
を公開される場合には、「本教材 (or 本資料) は
http://www.al.ics. saitama-u.ac.jp/horiyama/OCW/ の教材です
(or 教材を改変したものです」 との旨の著作権表示を明確に実施
してください。なお、この教材に改変等を加えたものの著作権は、
次ページ以降に示す著作者および改変等を加えた方に帰属しま
す。
同一条件での頒布・再頒布

この教材、または翻訳や改変等を加えたものを頒布・再頒布する
場合には、頒布・再頒布の形態を問わず、このページの利用条件43
この教材のご利用について

配布場所

http://www.al.ics.saitama-u.ac.jp/horiyama/OCW/

この powerpoint ファイルの著作者

堀山 貴史 2007-2010 [email protected]

改変等を加えられた場合は、お名前等を追加してください
図の著作者

p. 3, 4, 14 ~ 17, 19 ~ 22, 40
 クリップアート : Microsoft Office Online / クリップアート

その他
 堀山 貴史

44