探索のためのデータ構造

Download Report

Transcript 探索のためのデータ構造

1
アルゴリズムとデータ
構造
第7回探索のためのデータ構造(1)
2014/11/19
アルゴリズムとデータ構造 2014
前回の復習
2
整列のアルゴリズム
比較に基づくか?
基づかない
バケットソート、基数ソート O(m+n)
m:バケット数
基づく
最悪/平均時間計算量の下界Ω(n log n)
最悪/平均時間計算量がΘ(n2)のアルゴリズム
挿入ソート、選択ソート、バブルソート
最悪/平均時間計算量がΘ(n log n)のアルゴリズム
マージソート、ヒープソート
C言語の標準ライブラリ関
数qsortは一般的にクイッ
クソートで実装されている。
最悪時間計算量がΘ(n2)だが平均時間計算量がΘ(n log n)のアルゴリズム
クイックソート
最悪時間計算量がΘ(n(log n)2)のアルゴリズム
シェルソート
2014/11/19
アルゴリズムとデータ構造 2014
3
辞書とは?
次の3つの基本操作を伴う集合Sを辞書(dictionary)という。
1. member(x,S) : x∈Sならばyes, x ∈Sならばnoを出力
2. Insert(x,S) : SをS∪{x}に更新
3. delete(x,S) : SをS -{x}に更新
ここでは、辞書に適したデータ構造について学ぶ。
2014/11/19
アルゴリズムとデータ構造 2014
member(2,S)
4
left
整列された配列
mid
right
1 3 5 7 9 1012141618
S: 全順序集合
left mid
A[0],A[1],…,A[n-1]: 配列AにSの要素を小さい順に格納
member(x,S) : 2分探索(binary search)が適用可能
(最悪時間計算量O(log n))
insert(x,S), delete(x,S) : 配列への挿入,削除操作を伴う
(最悪時間計算量O(n))
right
1 3 5 7 9 1012141618
leftmid right
1 3 5 7 9 1012141618
1 3 5 7 9 1012141618
[2分探索によるmember(x,S)操作]
Step 1 left←0, right←n
Step 2 left≧rightであればnoを出力して停止
Step 3 mid← (left+right)/2
Step 4 if x<A[mid] then right←mid
else if x=A[mid] then yesを出力して停止
else left←mid+1
Step 2 へ
2014/11/19
1 3 5 7 9 1012141618
no!
このループを最悪 高々
(log2 n)+1 回まわる!
1回で範囲を半分以下に絞れる。
k回で範囲をn/2k以下に絞れる。
範囲が空となったら終わりだから
n/2k<1。よってlog2n<k。これを満た
す最小の整数は (log2n)+1以下 。
アルゴリズムとデータ構造 2014
5
2分探索木
S: 全順序集合
2分木(binary tree)とは
各節点が高々2つの子をもつ根付き木
2分木の各節点にSの要素を辞書に適した構造で格納することを考える。
2分探索木(binary search tree)とは
任意の節点uに対して次の条件が成り立つ2分木
uの左部分木の任意の節点の要素<
uの要素<uの右部分木の任意の節点の要素
2分木の例
2分探索木の例
根
5
7
vの親
u
uの左部分木
1
4
8
v
6
uの子
2014/11/19
3
10
u 3
5
1
7
4
6
10
8
同じ要素が格納された
uの右部分木 異なる2分探索木
アルゴリズムとデータ構造 2014
2分探索木における操作
6
[2分探索木のmember(x,S)操作]
member(5,S)
Step 1 u←根の節点
Step 2 y←節点uの要素
Step 3 if x=y then yesを出力して停止
else if x>y then
if 右の子が存在 then u←右の節点
else noを出力して停止
else
if 左の子が存在 then u←左の節点
else noを出力して停止
Step 2へ
7 <9
9< 10 u
3
1
u
4 8 <9
6
5
2014/11/19
5< 7
u
u
3 <5
10
3
u
4 8
<5
1 u
u
5= 5
1
6 <5
u
7 <9
9< 10 u
u
4 8 <9
右の子が
6 ない!
5
no!
yes!
[2分探索木のinsert(x,S)操作]
Step 1 u←根の節点
Step 2 y←節点uの要素
insert(9,S)
u
member(9,S)
9
Step 3 if x=y then 何もしないで停止
else if x>y then
if 右の子が存在 then u←右の節点
else uの右の子としてxを要素とする節点を追加して停止
else
if 左の子が存在 then u←左の節点
else uの左の子としてxを要素とする節点を追加して停止
Step 2へ
アルゴリズムとデータ構造 2014
7
2分探索木における操作
5< 7
u
3 <5
10
u
[2分探索木のdelete(x,S)操作]
Step 1 u←根の節点
Step 2 y←節点uの要素
delete(4,S)
delete(5,S)
1 u
4
u
8
<5
6 <5
5= 5
4< 7
u
3 <4
10
u
1 u
6
4
5
delete(7,S)
u delete(3,S)
Step 3 if x=y then Step 4 へ
7= 8
3< 7 u
7 u
else if x>y then
if 右の子が存在 then u←右の節点
10
u 3
4 =3 10
3
else 何もしないで停止
v
6 8
1
4 8
1 v 4
else
if 左の子が存在 then u←左の節点
5
6
6
else 何もしないで停止
Step 2へ
5
5
Step 4 if uは葉 then uを木から除いて停止
else if uが1つの子をもつ then uの子をuの位置に上げて停止
else (uが2つの子をもつ場合) v←uの右部分木の最小要素をもつ節点
Step 5 uの要素←vの要素
Step 6 if vは葉 then vを木から除いて停止
else (vが1つの子を持つ場合) vの子をvの位置に上げて停止
2014/11/19
8
=4
6
5
vは部分木の最
小要素をもつ節
点なので子の数
は高々1つ
アルゴリズムとデータ構造 2014
8
n要素の2分探索木に対する操作の時間計算量
n要素の2分探索木に対するmember(x,S), insert(x,S), delete(x,S)操作の
計算時間は、
x∈Sの場合、 xを要素としてもつ節点の深さに比例する。
(2つの子をもつ節点のdeleteはその節点の右部分木の最小要素の節点の深さに比例する)
x∈ Sの場合は、insert(x,S)を行うことによってできる
xを要素としてもつ節点の深さ(から1を引いた値)に比例する。
最悪時間計算量 O(n)
節点の深さがn-1の場合(S=φから小さい順、大きい順にinsert(x,S)を行った場合)
4
1
大きい順
小さい順
3
2
格納
格納
2
3
1
4
平均時間計算量 O(log n)
節点の深さの期待値はO(log n)
2014/11/19
アルゴリズムとデータ構造 2014
9
2分探索木の節点の深さの期待値はO(log n)
(証明) 2分探索木の全ての節点がちょうど2つの子をもつようにn+1個の節点を加える。
もとの節点を内点、新しく加えた節点を外点と呼ぶ。
外点の深さの平均≧内点の深さの平均
7
10 内点
3
1
外点
8
4
であるから外点の深さの平均がO(log n)であること
を示せばよい。
D(n)を外点の深さの平均とする。
最初に格納されるものがi番目の大きさである確率
を1/n(等確率)とすれば
6
5
1 n i(D(i-1)+1) + (n-i+1)(D(n-i)+1)
D(n)= Σ
n i=1
n+1
i番目の要素
i-1個
の要素
(内点)
2014/11/19
n-i個
の要素
(内点)
n
=
2
ΣiD(i-1) + 1
n(n+1) i=1
=
2
2 n-1
ΣiD(i-1) + 1
n(n+1) n(n-1)i=1
外点の数=内点の数+1
n(n-1)
n(n-1)
+nD(n-1)
2
2
+1
2
= D(n-1) +
n+1
アルゴリズムとデータ構造 2014
10
証明つづき
よってD(n)-D(n-1)=2/(n+1)、D(0)=0であるから
1
n+1
D(n)=2Σ i ≦ 2 ∫ 1 (1/x) dx=2loge (n+1)
i=2
n+1
したがってD(n)=O(log n)である。
(証明終わり)
1
1/2
1/3
…
1
2014/11/19
2
n n+1
アルゴリズムとデータ構造 2014
11
木のなぞり
木のなぞり(traverse)とは、
木のすべての節点を組織だった方法で訪問すること
深さ優先探索(depth-first search)による木のなぞり
7
1
2
3
10
9
14
11
12
13
3 4
1
4
5
6
5
10
8
8
6
前順(行きがけ順、preorder)
最初の訪問時に出力
7, 3, 1, 4, 6, 5, 10, 8
中順(通りがけ順、inorder)
左の部分木のなぞりが終わった後に出力
1, 3, 4, 5, 6, 7, 8, 10
7
2分探索木を中順出力すると
整列された要素のリストが
えられる!
2014/11/19
すべての節点の要素を次の3種類の順番で出力できる。
後順(帰りがけ順, postorder)
最後の訪問時に出力
1, 5, 6, 4, 3, 8, 10, 7
アルゴリズムとデータ構造 2014
平衡探索木
12
平衡探索木(balanced search tree)とは
各節点において、その子節点を根とする全ての部分木の高さが
ほぼ平衡している探索木
[主な平衡探索木]
AVL木 どの節点においても、その左部分木と右部分木の高さの差が1以下
である2分探索木。AVLは2人の提唱者の頭文字
1≧
(G. M. Adel’son-Vel’skii and Y. M. Landis)
2色木 2分探索木の各辺に次の条件を満たすように赤か黒の色を塗れるもの
1. 外点に接続する辺の色は黒。
2. 根から外点に至るどの路の上でも、赤い辺が連続することはない。
3. 根から外点に至るどの路も、含む黒色の辺の本数は同じ。
B木
根と葉を除く各節点が m/2 個以上、m個以下の子をもつ探索木。
ただし、mは自然数。
2-3 木 m=3の場合のB木。
2014/11/19
アルゴリズムとデータ構造 2014
13
AVL木における操作
[AVL木のinsert(x,S)操作]
u
TL
u
TR
:節点uの左部分木
E→L v
:節点uの右部分木
[挿入に伴う回転操作]
L
E v
u
u E
s(u) : 節点uの状態。
回転
挿入前には以下のように設定されている。
L
s(u)= E
R
u
u
if T L の高さ > T R の高さ
u
u
if T L の高さ = T Rの高さ
u
u
if T L の高さ < T R の高さ
E→R v
u L
w E→L
Step 1 一般の2分木の同じように挿入を行う。
挿入した節点の親節点をuとする。
Step 2 s(u)≠Eとなるまで次のことを繰り返す。
1. s(u)の更新(挿入して高くなった方(L or R)に更新
2. u←uの親
u
Step 3 if s(u)=R かつTL が高くなった or
u
s(u)=L かつ TR が高くなった
then
s(u)←Eとして停止
else 回転して停止
2014/11/19
回
転
w E
E v
u R
アルゴリズムとデータ構造 2014
14
AVL木における操作(2)
[AVL木のdelete(x,S)操作]
Step 1 一般の2分木の同じように削除を行う。
削除した最も下の節点の親節点をuとする。
Step 2 s(u)=Eとなるまで次のことを繰り返す。
1. if s(u)=LかつT uL が低くなった or
u
s(u)=RかつT R が低くなった
then
s(u)←E
u
else if s(u)=RかつT L が低くなった or
u
s(u)=LかつT R が低くなった
then
(1) 回転
(2) s(u)≠Eならば停止
2. u←uの親
Step 3 s(u)の更新(低くなった方の逆(L or R)に更新)
R u
[削除に伴う回転操作]
u
L
R
v
v E
回転
R u
高さ変化せず
u
E
R
v
v R
回転
E u
E w
v L
Eu
Ew
v E
高さ1減少
回転
高さ1減少
2014/11/19
アルゴリズムとデータ構造 2014
15
n要素のAVL木に対する操作の時間計算量
n要素のAVL木に対するmember(x,S), insert(x,S), delete(x,S)操作の
計算時間は、
最悪時間計算量 O(log n)
平均時間計算量 O(log n)
n節点のAVL木の高さはO(log n)
[n節点のAVL木の高さはO(log n)の証明]
f(h)を高さhのAVL木の最小節点数とすれば、
以下の漸化式が成り立つ。
f(h)=f(h-1)+f(h-2)+1, f(0)=1, f(1)=2
F(h)=f(h)+1とすれば
F(h)=F(h-1)+F(h-2), F(0)=2, F(1)=3
F(h)はフィボナッチ数列だから
F(h)=(φ1h+3 – φ2h+3)/ 5
ただし、 φ1=(1+
5)/2, φ2=(1- 5)/2
高さhのAVL木の節点数をnとすれば、
f(h) ≦ n
2014/11/19
高さhの節点数最小の木
高さh-1の節点数
最小の木
高さh-2の節点数
最小の木
φ1h+3 – φ2h+3 ≦
5 (n+1)
|φ2|<1だから
φ1h+3 – 1 ≦
h ≦
5 (n+1)
log( 5 (n+1)+1)
-3
log φ1
したがってh=O(log n)
アルゴリズムとデータ構造 2014