6 6 장 장장장 장장 장 장장장 장장
Jan 09, 2016
66 장 인덱스 구조장 인덱스 구조
2
인덱스인덱스 키값과 해당 레코드 주소쌍의 체계적 모음키값과 해당 레코드 주소쌍의 체계적 모음
목적 목적 : : 레코드 접근 용이레코드 접근 용이
밀집밀집 (dense) (dense) 인덱스 인덱스 : : 모든 레코드에 대한 키값모든 레코드에 대한 키값 -- 주소 주소 쌍쌍
희소희소 (sparse) (sparse) 인덱스인덱스
3
이원 탐색 트리 이원 탐색 트리 (binary search tree)(binary search tree) 노드 노드 Ni = (Ni = ( 키 키 K, K, 주소주소 )) ① ① Nj RT(Ni) → Ki < Kj∈Nj RT(Ni) → Ki < Kj∈ ② ② Nj LT(Ni) → Kj < Ki∈Nj LT(Ni) → Kj < Ki∈
DOG
COW
BEAR DEER FOX
HORSE
이원 탐색 트리
4
▶ ▶ 탐색과 삽입탐색과 삽입 탐색탐색
– 루트 Ni, 탐색키 K① 공백 트리 : 탐색 실패 , 종료
② K = Ki : Ni 가 목표 노드 ③ K < Ki : Ni ← ROOT(LT(Ni)) ④ K > Ki : Ni ← ROOT(RT(Ni))
삽입삽입– 리프 노드의 위치에 삽입– 루트 Ni, 삽입 레코드의 키 K ① 공백 트리 : K 의 노드가 루트 ② K = Ki : 삽입 실패 ③ K < Ki : 왼쪽 서브트리 탐색 ④ K > Ki : 오른쪽 서브트리 탐색
5
▶ ▶ 삭제와 성능삭제와 성능 삭제삭제
– 리프의 삭제 : 노드 제거– 리프가 아닌 경우 : 서브트리 유지– 삭제 표시
성능성능– 자주 접근되는 노드 - 루트에 근접– 균형 트리 (balanced tree)
트리의 최대 경로 길이를 최소화 N 노드 : log2N + 1
6
AVL AVL 트리트리 높이균형 이진트리높이균형 이진트리 (height-balanced binary tree)(height-balanced binary tree) Adelson-VelskiiAdelson-Velskii 와 와 LandisLandis 가 소개가 소개
정의정의– T = AVL 트리– 공백이 아닌 이진 트리– h(LT(Ni)) - h(RT(Ni)) ≤ 1 Ni T∈– N 노드 AVL 트리에서 임의 접근 : O (log N)
7
▶ ▶ AVL AVL 트리 예트리 예
50
30 80
20
10
40 60
9070
100
110
120
100
110
120
8
▶ ▶ AVL AVL 트리의 재균형 트리의 재균형 (( 삽입시삽입시 ))
20
3010
40
10 30
20
40
30
20
50
50
10 40
20
30
(a)
(b)
(c) (d)
10
9
▶ ▶ AVL AVL 트리의 높이트리의 높이 log2(N+1) ≤ h ≤ 1.4404log2(N+2)-0.328log2(N+1) ≤ h ≤ 1.4404log2(N+2)-0.328
OO (1.4 log N) : (1.4 log N) : OO (log N)(log N)
부분 재균형 부분 재균형 : : 전체 트리의 재균형전체 트리의 재균형
10
m-m- 원 탐색 트리원 탐색 트리 (m-1) (m-1) 키키 , m , m 서브트리서브트리
– 높이 감소 : 탐색 시간 감소– 삽입 , 삭제 : 균형 유지 어려움
특성특성T : m-T : m- 원 탐색 트리원 탐색 트리
① ① 노드 구조노드 구조
(Ki : (Ki : 키 키 , Pi : , Pi : 서브트리에 대한 포인터 서브트리에 대한 포인터 , 1 ≤ n ≤ m), 1 ≤ n ≤ m) ② ② 키의 오름차순 키의 오름차순 : Ki < Ki+1 i=1,2,..,n-2: Ki < Ki+1 i=1,2,..,n-2 ③ ③ PiPi 가 지시하는 서브트리 내의 키값 가 지시하는 서브트리 내의 키값 < Ki< Ki ④ ④ PnPn 이 지시하는 서브트리 내의 키값 이 지시하는 서브트리 내의 키값 > Kn-1> Kn-1 ⑤ ⑤ PiPi 가 지시하는 서브트리 가 지시하는 서브트리 : m-: m- 원 서브트리원 서브트리
nn PP11 KK11 PP22 KK22 PP33 …… PPn-1n-1 KKn-1n-1 PPnn
11
▶ ▶ 33 원 탐색 트리원 탐색 트리
a
b c d
e f g h i j
3 100 140
3 30 60 3 110 120 3 170 200
10 20 40 50 70 90 150 160 180 220
★ Ki → (Ki, Ai) Ai : 데이타 레코드의 주소
12
▶ ▶ 성능성능 m-m- 원 탐색트리 원 탐색트리 : m-1 : m-1 키키
높이 높이 h → (mh → (mhh-1)-1) 개의 키값개의 키값 3 → (33 → (333-1) = 26-1) = 26
n n 키 → 높이 키 → 높이 : : log logmm(n+1) (n+1) 최대 탐색시간 최대 탐색시간 : : OO (log(logmm(n+1))(n+1))
삽입삽입 , , 삭제시 트리의 균형 유지삭제시 트리의 균형 유지
13
B-B- 트리트리 Bayer & McCreightBayer & McCreight 균형 균형 m-m- 원 탐색 트리원 탐색 트리
차수 차수 mm 인 인 B-B- 트리의 특성트리의 특성① ① 루트와 리프를 제외한 노드의 서브트리 수루트와 리프를 제외한 노드의 서브트리 수 m/2 m/2 ≤ ≤ 개수 ≤ 개수 ≤ mm② ② 루트루트 (( 리프가 아닌리프가 아닌 )) 의 서브트리의 수 의 서브트리의 수 22③ ③ 모든 리프는 같은 레벨모든 리프는 같은 레벨④ ④ 키값의 수키값의 수 리프 리프 : : m/2 m/2 - 1 ~ (m-1) - 1 ~ (m-1) 리프가 아닌 노드 리프가 아닌 노드 : : 서브트리수 서브트리수 - 1- 1⑤ ⑤ 한 노드 내의 키값 한 노드 내의 키값 : : 오름차순오름차순
14
▶ ▶ B-B- 트리 구조트리 구조 노드 구조노드 구조
– Ki → (Ki, Ai)
nn PP11 KK11 PP22 KK22 PP33 …… PPn-1n-1 KKn-1n-1 PPnn
69
19 43 128 138
1451321006026 4016
7 15 18 20 30 36 42 50 58 62 65 70 110 120 130 136 140 150
a
b c
d e f g h i
j k l m n o p q r s t u v
차수 3 인 B- 트리 구조
15
▶ ▶ B-B- 트리 연산트리 연산 연산연산
– 직접 탐색 - 키 값에 의존한 분기– 순차 탐색 - 중위 순회– 삽입 , 삭제 - 트리의 균형 유지
분할 → 높이 증가 합병 → 높이 감소
삽입삽입(a) (a) 노드 노드 ll 에 에 22 22 삽입삽입
20
l
20
l
22
16
▶ ▶ B-B- 트리 삽입트리 삽입(b) (b) 노드 노드 nn 에 에 41 41 삽입삽입
(c) (c) 노드 노드 oo 에 에 59 59 삽입삽입
42 41
n
42
n
50
o
59
o’
50
o
58
60
f
58 60
f
bb
pp
17
▶ ▶ B-B- 트리 삽입트리 삽입(d) (d) 노드 노드 oo 에 에 57 57 삽입삽입
(e) 54(e) 54 의 삽입으로 노드 의 삽입으로 노드 oo 의 분열의 분열
(f) (f) 노드 노드 ff 에 에 54 54 삽입삽입
50
o
50
o’
57
50
o
54
o’’
50
o
5754를 부모 노드f 에 이동
60 58 60 54
f f f’
o o’ p o o’’ o’ p
58은 부모노드 b 에 삽입
57
18
▶ ▶ B-B- 트리 삽입트리 삽입(g) (g) 노드 노드 bb 에 에 58 58 삽입삽입
(h) (h) 노드 노드 aa 에 에 43 43 삽입삽입
69
a
b c
69 43
a
b b’ c
58 19 43 19
b b b’
d e f d e f f’
43은 부모노드 a 에 삽입
43 69
19
▶ ▶ 한 레벨 증가된 한 레벨 증가된 B-B- 트리트리
7 18 20 413630 5750 62 11070
16
d
26
e
40
e’
54
f
60
f’
100
g
123
g’
132
h
145
i
19
b
58
b’
120
c
138
c’
43
a
128
a’
ao
j k l m m’ n o o’’ o’ p q r r’ r’’ s t u v
33
15 22 42 65 7559
122 124 130 136 140 150
69
20
▶ ▶ 삽입 알고리즘삽입 알고리즘/* 알고리즘에서 사용되는 변수는 다음과 같다 .In-key : B- 트리에 삽입될 키Finished : 삽입이 완료되었음을 나타내는 플래그Found : B- 트리에서 레코드가 발견되었음을 나타내는 플래그P : 노드에 대한 포인터TOOBIG : 오버플로 노드를 위한 변수N : 키 카운터*/
/* 노드의 주소를 스택에 저장하면서 In-key 가 삽입될 위치를 탐색한다 . */Found = false;read root;
do { N = number of keys in current node; if (n-key == key in current node) found = true; else if (In-key < key1) P = Po; else if (In-key > keyN) P = PN; else P = Pi-1; /* for some i where keyi-1 < In-key < keyi */ if (P != null) { push onto stack address of current node; read node pointed to by P; }} while (!Found && P is not null);
21
B-B- 트리트리if (Found) report In-key already in tree;else { /* In-key 를 B- 트리에 삽입한다 */ P = nil; Finished = false;
do { if (current node is not full) { put In-key in current node; /* 노드 안에서 키 순서를 유지하도록 키를 정렬한다 */ Finished = true; } else { copy current node to TOOBIG; insert In-key and P into TOOBIG; In-key = center key of TOOBIG; current node = 1st half of TOOBIG; get space for new node, assign address to P; new node = 2nd half of TOOBIG; if (stack not empty) { pop top of stack; read node pointed to; } else { /* 트리의 레벨이 하나 증가한다 . */ get space for new node; new node = pointer to old root, In-key and P; Finished = true;
} }
} while (!Finished); }
22
▶ ▶ B-B- 트리 삭제트리 삭제 삭제삭제
– 노드 e' 에서 키 값 40 의 삭제
40
e’
41
e’
36
m’
36
m’
36
m’
42
n
41
n
40
n
41
e’
42 42
23
▶ ▶ 노드 노드 dd 에서 키 값 에서 키 값 1616 의 삭제의 삭제
d e
b
j k l m22
(a)
19 33
(b)
e’16 26
15 18 20 22 30
de
b
jk l m22
33
e’19 26
15 18 20 22 30
24
▶ ▶ B-B- 트리 삭제 알고리즘트리 삭제 알고리즘/* 알고리즘에서 사용된 변수는 다음과 같다 . Finished : 삭제가 완료되었음을 나타내는 플래그 TWOBNODE : 재분배를 위해 사용되는 정상 노드 보다 50% 큰
노드 A-sibling : 인접 형제 노드 Out-key : B- 트리에서 삭제될 키*/
search tree for Out-key forming stack of node addresses;/* 자세한 것은 그림 8.9 의 삽입 알고리즘 참조 */
if (Out-key is not in terminal node) { search for successor key of Out-key at terminal level (stacking node addre
sses); copy successor over Out-key; terminal node successor now becomes the Out-key;}
/* 키를 삭제하고 트리를 재조정한다 . */Finished = false;
25
B-B- 트리트리do { remove Out-key if (current node is root or is not too small) Finished = true; else if (redistribution possible) { /* A-sibling > minimum 이 성립할 때 재분배 가능 */ /* 재분배 실행 */ copy "best" A-sibling, intermediate parent key, and current (too-small) node into TWOBNODE; copy keys and pointers from TWOBNODE to "best" A-sibling, parent, and current node so A-sibling and current node are roughly equal size; Finished = true; } else { /* 적당한 A-sibling 과 합병한다 */ choose best A-sibling to concatenate with; put in the leftmost of the current node and A-sibling the contents of both nodes and the intermediate key from the parent; discard rightmost of the two nodes; intermediate key in parent now becomes Out-key; } } while (!Finished);if (no keys in root) { /* 트리의 레벨이 하나 감소한다 */ new root is the node pointed to by the current root; discard old root;
}
26
B*-B*- 트리트리 2/3 2/3 정도 찬 노드들을 가지는 정도 찬 노드들을 가지는 B-B- 트리트리
노드 분할의 횟수 줄임노드 분할의 횟수 줄임
노드가 가득참 → 형제노드로 분산 노드가 가득참 → 형제노드로 분산 (( 이동이동 ))
두 개의 이웃노드가 모두 가득 찼을 때의 삽입두 개의 이웃노드가 모두 가득 찼을 때의 삽입– 두 개의 노드를 세 개로 분할시킴– 2/3 가득 참
27
▶ ▶ B*-B*- 트리 삽입트리 삽입 차수가 차수가 mm 인 인 B*-B*- 트리트리
차수가 차수가 mm 인 인 B*-B*- 트리에서 재분배를 이용한 키 값 트리에서 재분배를 이용한 키 값 KmKm의 삽입의 삽입
d s
r
K j
K 1 K 2 K m-1 K’1 K’2 K’n
q
s
K
c
K 1 K 2 K c-1
K m K j K’n
K c+1 K m-1 K’1
28
▶ ▶ 재분배를 이용한 삽입 예재분배를 이용한 삽입 예 차수가 차수가 55 인 인 B*-B*- 트리에서 재분배를 이용한 키 값 트리에서 재분배를 이용한 키 값 2424
의 삽입의 삽입
33
r
18 20 22 26
q
35
s
(a)
(b)
24
r
18 20 22
q s
26 33 35
29
▶ ▶ 차수가 차수가 mm 인 인 B*-B*- 트리에서의 노드 분열트리에서의 노드 분열
Kj
K’m-1K’2K’1Km-1K2K1
r
q s
K
r
KK2K1
q
K’m-1
s
q’
K
(a)
(b)
K
K K K
30
▶ ▶ 노드분열을 이용한 삽입노드분열을 이용한 삽입 차수가 차수가 55 인 인 B*-B*- 트리에서 노드 분열을 이용한 키 값 트리에서 노드 분열을 이용한 키 값 22
44 의 삽입의 삽입
33
18 20 22 26
r
q
(a)
35 41 43 48
s
35
r
22
48
s
43
20
q
18
33 26 41 24
(b)
q’
31
B+-B+- 트리트리 인덱스 셑 인덱스 셑 (index set)(index set)
– 내부 노드– 리프에 있는 키들에 대한 경로정보 제공
순차 셑 순차 셑 (sequence set)(sequence set)– 리프 노드– 모든 키 값들을 포함– 순차셑은 순차적으로 연결
직접 또는 순차 접근– 내부 노드와 다른 구조
32
▶ ▶ 차수가 차수가 33 인 인 B+-B+- 트리트리
7
j
16 18
k
19 20
l
26 30
m
36 40
n
42 43
o
50 58
p
60 62
q
65 69
r
70 100
s
110 120128
u
130
v
132136
w
138140
x
145150
y
15 18
d
30 40
e
100
g
58 62
f
128 130
h
140
i
20 43
b
110 136
c
69
순차세트
인덱스세트
a
t
{{
33
▶ ▶ B+-B+- 트리 특성트리 특성① ① 루트의 서브트리 루트의 서브트리 : 0, 2, : 0, 2, m/2 m/2 m ∼ m ∼
② ② 노드의 서브트리 노드의 서브트리 (( 루트루트 ,, 리프제외리프제외 ) : 2 m∼) : 2 m∼
③ ③ 모든 리프는 동일 레벨모든 리프는 동일 레벨
④ ④ 리프가 아닌 노드의 키값 수 리프가 아닌 노드의 키값 수 : : 서브트리수서브트리수 -1-1
⑤ ⑤ 리프노드 리프노드 : : 데이타 화일의 순차셑 데이타 화일의 순차셑 (( 리스트로 연결리스트로 연결 ))
34
▶ ▶ B+-B+- 트리 연산트리 연산 연산연산
– 탐색 B+- 트리의 인덱스 셑 = m- 원 탐색 트리 리프에서 검색
– 삽입 B- 트리와 유사 오버플로우 ( 분열 ) → 부모노드 , 분열노드 모두에 키값 존재
– 삭제 리프에서만 삭제 ( 재분배 , 합병 없는 경우 ) 재분배시 : 인덱스의 키값도 삭제
35
트라이 트라이 (Trie)(Trie) 글자나 숫자의 위치에 의해 키값을 나타내는 자료구조글자나 숫자의 위치에 의해 키값을 나타내는 자료구조
1010 원 트라이의 노드 구조원 트라이의 노드 구조
P1P1 P1P2 P1P3 P1P4 P1P5 P1P6 P1P7 P1P8 P1P9 P1P10
0 1 2 3 4 5 6 7 8 9
36
▶ ▶ m-m- 원 트라이원 트라이 mm 진 트리진 트리
– m = 10 : 숫자– m = 26 : 글자
레벨 레벨 j, Pj : j j, Pj : j 번째 값이 번째 값이 PiPi 인 모든 키값을 나타내는 인 모든 키값을 나타내는 서브트리를 가리킴서브트리를 가리킴
높이 높이 = = 키 필드의 길이키 필드의 길이 최대 탐색 비용 최대 탐색 비용 키 값의 길이 키 값의 길이 균일한 탐색시간균일한 탐색시간 (( 키내의 숫자나 글자수키내의 숫자나 글자수 ))
37
▶ ▶ 높이가 높이가 44 인 인 1010 원 트라이원 트라이
0123456789
00 0 0 00
0123456789
**0*******
0123456789
00**0**000
0123456789
**0*0*0*0*
0123456789
*0*0*0*0*0
0123456789
0**0***0**
0123456789
**0**0**0*
0123456789
00**0****0
0123456789
*0**0**0**
0123456789
0 0000000
0123456789
000000000
0123456789
00000000
0123456789
0000 0000
0123456789
000000000
0123456789
000 00000
0123456789
00 000000
0123456789
00 00 0000
0123456789
000 0
0 : 널 포인터* : 해당 키값을 가지고 있는 데이타 레코드의 주소
r
a
b
c
레벨 1
레벨 2
레벨 3
레벨 4
P3
P4
P1
d