Analysis of Algorithms

1
T
A
B
F
D
行きがけ順: A B D F I J C G H
通りがけ順: D B I F J A G C H
帰りがけ順: D I J F B G H C A
C
I
G
J
H
1
T
A
B
F
D
行きがけ順: A B D F I J C G H
通りがけ順: D B I F J A G C H
帰りがけ順: D I J F B G H C A
C
I
G
J
H
1
T
A
B
F
D
行きがけ順: A B D F I J C G H
通りがけ順: D B I F J A G C H
帰りがけ順: D I J F B G H C A
C
I
G
J
H
1
T
A
B
F
D
行きがけ順: A B D F I J C G H
通りがけ順: D B I F J A G C H
帰りがけ順: D I J F B G H C A
C
I
G
J
H
1
T
A
B
F
D
行きがけ順: A B D F I J C G H
通りがけ順: D B I F J A G C H
帰りがけ順: D I J F B G H C A
C
I
G
J
H
1
T
A
B
F
D
行きがけ順: A B D F I J C G H
通りがけ順: D B I F J A G C H
帰りがけ順: D I J F B G H C A
C
I
G
J
H
1
T
A
B
F
D
行きがけ順: A B D F I J C G H
通りがけ順: D B I F J A G C H
帰りがけ順: D I J F B G H C A
C
I
G
J
H
1
T
A
B
F
D
行きがけ順: A B D F I J C G H
通りがけ順: D B I F J A G C H
帰りがけ順: D I J F B G H C A
C
I
G
J
H
1
T
A
B
F
D
行きがけ順: A B D F I J C G H
通りがけ順: D B I F J A G C H
帰りがけ順: D I J F B G H C A
C
I
G
J
H
1
T
A
B
F
D
行きがけ順: A B D F I J C G H
通りがけ順: D B I F J A G C H
帰りがけ順: D I J F B G H C A
C
I
G
J
H
1
T
A
B
F
D
行きがけ順: A B D F I J C G H
通りがけ順: D B I F J A G C H
帰りがけ順: D I J F B G H C A
C
I
G
J
H
1
T
A
B
F
D
行きがけ順: A B D F I J C G H
通りがけ順: D B I F J A G C H
帰りがけ順: D I J F B G H C A
C
I
G
J
H
1
T
A
B
F
D
行きがけ順: A B D F I J C G H
通りがけ順: D B I F J A G C H
帰りがけ順: D I J F B G H C A
C
I
G
J
H
1
T
A
B
F
D
行きがけ順: A B D F I J C G H
通りがけ順: D B I F J A G C H
帰りがけ順: D I J F B G H C A
C
I
G
J
H
1
T
A
B
F
D
行きがけ順: A B D F I J C G H
通りがけ順: D B I F J A G C H
帰りがけ順: D I J F B G H C A
C
I
G
J
H
1
T
A
B
F
D
行きがけ順: A B D F I J C G H
通りがけ順: D B I F J A G C H
帰りがけ順: D I J F B G H C A
C
I
G
J
H
1
T
A
B
F
D
行きがけ順: A B D F I J C G H
通りがけ順: D B I F J A G C H
帰りがけ順: D I J F B G H C A
C
I
G
J
H
2 (1/3)
60 40 80 50 70 30 90 20 100 0 10 5 15
40 60 80
60
40 50
60
30 40 50
80
40 60
70 80 90
20 30
50
70 80 90
2 (2/3)
60 40 80 50 70 30 90 20 100 0 10 5 15
40 60 80
20 30
50
70
90 100
60
40
0 20 30
80
50
70
90 100
2 (3/3)
60 40 80 50 70 30 90 20 100 0 10 5 15
60
20 40
0 5 10
30
80
50
70
90 100
60
5 20 40
0
10 15
80
30
50
70
90 100
3 (1/8)
20 5 30 10
20 60
10
5
70
30 50
15
25
35 45
55
65
75
3 (2/8)
20 5 30 10
25 60
10
5
70
30 50
15
20
35 45
55
65
75
3 (3/8)
20 5 30 10
25 60
10
5
70
30 50
15
35 45
55
65
75
3 (4/8)
20 5 30 10
25 60
10
5
70
35 50
15
30
45
55
65
75
3 (5/8)
20 5 30 10
35 60
10 25
5
15
70
50
30
55
45
65
75
35 60
10 25
15
70
50
30
45
55
65
75
3 (6/8)
20 5 30 10
35 60
25
10 15
70
50
30
55
45
65
75
60
25 35 50
10 15
30
45
70
55
65
75
3 (7/8)
20 5 30 10
60
25 35 50
10 15
70
55
45
65
75
60
15 35 50
10
25
45
70
55
65
75
3 (8/8)
20 5 30 10
60
15 35 50
25
70
55
45
65
75
60
35 50
15 25
45
70
55
65
75
4
01: RB-INSERT(T,x)
02:
TREE-INSERT(T,x)
03:
color [x ] ← RED
04:
while x ≠ root [T ] and color [p [x ]] = RED
05:
do if p [x ] = left [p [p [x ]]]
06:
then y ← right [p [p [x ]]]
07:
if color [y ] = RED
08:
then <Case 1>
09:
else
10:
if x = right [p [x ]]
11:
then <Case 2>
12:
<Case 3>
13:
else <“then” clause with “left ” and “right ” swappe
14:
color [root [T ]] ← BLACK
4.1
01: RB-INSERT(T,x)
02:
TREE-INSERT(T,x)
03:
color [x ] ← RED
10
04:
while x ≠ root [T ] and color [p [x ]] = RED
05:
do if p [x ] = left [p [p [x ]]]
22
06:
then y ← right [p [p [x ]]]
07:
if color [y ] = RED
x
08:
then <Case 1>
26
09:
else
10:
if x = right [p [x ]]
11:
then <Case 2>
12:
<Case 3>
13:
else <“then” clause with “left ” and “right ” swapped>
14:
color [root [T ]] ← BLACK
7
05: 挿入したノードの親ノードが祖父ノードの左ノードの時以下の処理をする。
06-08: 親ノードの兄弟ノードが赤ノードならば Case 1 の処理をする。
09-12: 親ノードの兄弟ノードが黒ノードで挿入したノードが親ノードの右ノードならば
Case 2 の処理の後 Case 3 の処理をする。挿入したノードが親ノードの左
ノードならば Case 3 の処理をする。
4.2 (1/3)
<Case 1>
22
recolor
35
7
10
26
35
7
36
30
22
10
26
36
30
4.2 (2/3)
<Case 2>
40
left-rotate
22
42
35
35
7
10
40
26
30
22
36
7
10
42
36
26
30
4.2 (3/3)
<Case 3>
40
35
22
7
10
30
right-rotate
42
36
26
35
40
22
7
10
26
30
36
42
5
G(V, E)
B
A
E
F
G
C
D
5.1
G(V, E)
B
A
E
F
G
C
D
5.1
G(V, E)
B
A
E
F
G
C
D
5.2
G(V, E)
B
A
E
F
G
C
D
5.3
G(V, E)
B
G(V, E)
A
B
E
A
E
F
F
G
G
C
C
D
D
6
01: Algorithm DFS(G)
02: Input graph G
03: Output labeling of the edges of G
04:
as discovery edges and back edges
05: for all u ∈ G.vertices()
06:
07:
08:
09:
10:
11:
setLabel(u, UNEXPLORED)
for all e ∈ G.edges()
setLabel(e, UNEXPLORED)
for all v ∈ G.vertices()
if getLabel(v) = UNEXPLORED
DFS(G, v)
11: Algorithm DFS(G, v)
12: Input graph G and a start vertex v of G
13: Output labeling of the edges of G
14:
in the connected component of v
15:
as discovery edges and back edges
16:
setLabel(v, VISITED)
for all e ∈ G.incidentEdges(v)
if getLabel(e) = UNEXPLORED
w ← opposite(v,e)
if getLabel(w) = UNEXPLORED
setLabel(e, DISCOVERY)
DFS(G, w)
else
setLabel(e, BACK)
17:
18:
19:
20:
21:
22:
23:
24:
6
01: Algorithm DFS(G)
02: Input graph G
03: Output labeling of the edges of G
04:
as discovery edges and back edges
05: for all u ∈ G.vertices()
06:
setLabel(u, UNEXPLORED)
07: for all e ∈ G.edges()
08:
setLabel(e, UNEXPLORED)
09: for all v ∈ G.vertices()
10:
if getLabel(v) = UNEXPLORED
11:
DFS(G, v)
17:
18:
19-22:
23-24:
11: Algorithm DFS(G, v)
12: Input graph G and a start vertex v of G
13: Output labeling of the edges of G
14:
in the connected component of v
15:
as discovery edges and back edges
16:
setLabel(v, VISITED)
17:
for all e ∈ G.incidentEdges(v)
18:
if getLabel(e) = UNEXPLORED
19:
w ← opposite(v,e)
20:
if getLabel(w) = UNEXPLORED
21:
setLabel(e, DISCOVERY)
22:
DFS(G, w)
23:
else
24:
setLabel(e, BACK)
挿入したノードの親ノードが祖父ノードの左ノードの時以下の処理をする。
親ノードの兄弟ノードが赤ノードならば Case 1 の処理をする。
親ノードの兄弟ノードが黒ノードで挿入したノードが親ノードの右ノードならば
Case 2 の処理の後 Case 3 の処理をする。挿入したノードが親ノードの左
ノードならば Case 3 の処理をする。