37
6 6 장 장장장 장장 장 장장장 장장

6 장 인덱스 구조

  • Upload
    donnan

  • View
    79

  • Download
    6

Embed Size (px)

DESCRIPTION

6 장 인덱스 구조.  인덱스. 키값과 해당 레코드 주소쌍의 체계적 모음 목적 : 레코드 접근 용이 밀집 (dense) 인덱스 : 모든 레코드에 대한 키값 - 주소 쌍 희소 (sparse) 인덱스.  이원 탐색 트리 (binary search tree). 노드 Ni = ( 키 K, 주소 ) ① Nj ∈ RT(Ni) → Ki < Kj ② Nj ∈ LT(Ni) → Kj < Ki. 이원 탐색 트리. ▶ 탐색과 삽입. 탐색 루트 Ni, 탐색키 K - PowerPoint PPT Presentation

Citation preview

Page 1: 6 장 인덱스 구조

66 장 인덱스 구조장 인덱스 구조

Page 2: 6 장 인덱스 구조

2

인덱스인덱스 키값과 해당 레코드 주소쌍의 체계적 모음키값과 해당 레코드 주소쌍의 체계적 모음

목적 목적 : : 레코드 접근 용이레코드 접근 용이

밀집밀집 (dense) (dense) 인덱스 인덱스 : : 모든 레코드에 대한 키값모든 레코드에 대한 키값 -- 주소 주소 쌍쌍

희소희소 (sparse) (sparse) 인덱스인덱스

Page 3: 6 장 인덱스 구조

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

이원 탐색 트리

Page 4: 6 장 인덱스 구조

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 : 오른쪽 서브트리 탐색

Page 5: 6 장 인덱스 구조

5

▶ ▶ 삭제와 성능삭제와 성능 삭제삭제

– 리프의 삭제 : 노드 제거– 리프가 아닌 경우 : 서브트리 유지– 삭제 표시

성능성능– 자주 접근되는 노드 - 루트에 근접– 균형 트리 (balanced tree)

트리의 최대 경로 길이를 최소화 N 노드 : log2N + 1

Page 6: 6 장 인덱스 구조

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)

Page 7: 6 장 인덱스 구조

7

▶ ▶ AVL AVL 트리 예트리 예

50

30 80

20

10

40 60

9070

100

110

120

100

110

120

Page 8: 6 장 인덱스 구조

8

▶ ▶ AVL AVL 트리의 재균형 트리의 재균형 (( 삽입시삽입시 ))

20

3010

40

10 30

20

40

30

20

50

50

10 40

20

30

(a)

(b)

(c) (d)

10

Page 9: 6 장 인덱스 구조

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)

부분 재균형 부분 재균형 : : 전체 트리의 재균형전체 트리의 재균형

Page 10: 6 장 인덱스 구조

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

Page 11: 6 장 인덱스 구조

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 : 데이타 레코드의 주소

Page 12: 6 장 인덱스 구조

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))

삽입삽입 , , 삭제시 트리의 균형 유지삭제시 트리의 균형 유지

Page 13: 6 장 인덱스 구조

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⑤ ⑤ 한 노드 내의 키값 한 노드 내의 키값 : : 오름차순오름차순

Page 14: 6 장 인덱스 구조

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- 트리 구조

Page 15: 6 장 인덱스 구조

15

▶ ▶ B-B- 트리 연산트리 연산 연산연산

– 직접 탐색 - 키 값에 의존한 분기– 순차 탐색 - 중위 순회– 삽입 , 삭제 - 트리의 균형 유지

분할 → 높이 증가 합병 → 높이 감소

삽입삽입(a) (a) 노드 노드 ll 에 에 22 22 삽입삽입

20

l

20

l

22

Page 16: 6 장 인덱스 구조

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

Page 17: 6 장 인덱스 구조

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

Page 18: 6 장 인덱스 구조

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

Page 19: 6 장 인덱스 구조

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

Page 20: 6 장 인덱스 구조

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);

Page 21: 6 장 인덱스 구조

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); }

Page 22: 6 장 인덱스 구조

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

Page 23: 6 장 인덱스 구조

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

Page 24: 6 장 인덱스 구조

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;

Page 25: 6 장 인덱스 구조

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;

}

Page 26: 6 장 인덱스 구조

26

B*-B*- 트리트리 2/3 2/3 정도 찬 노드들을 가지는 정도 찬 노드들을 가지는 B-B- 트리트리

노드 분할의 횟수 줄임노드 분할의 횟수 줄임

노드가 가득참 → 형제노드로 분산 노드가 가득참 → 형제노드로 분산 (( 이동이동 ))

두 개의 이웃노드가 모두 가득 찼을 때의 삽입두 개의 이웃노드가 모두 가득 찼을 때의 삽입– 두 개의 노드를 세 개로 분할시킴– 2/3 가득 참

Page 27: 6 장 인덱스 구조

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

Page 28: 6 장 인덱스 구조

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

Page 29: 6 장 인덱스 구조

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

Page 30: 6 장 인덱스 구조

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’

Page 31: 6 장 인덱스 구조

31

B+-B+- 트리트리 인덱스 셑 인덱스 셑 (index set)(index set)

– 내부 노드– 리프에 있는 키들에 대한 경로정보 제공

순차 셑 순차 셑 (sequence set)(sequence set)– 리프 노드– 모든 키 값들을 포함– 순차셑은 순차적으로 연결

직접 또는 순차 접근– 내부 노드와 다른 구조

Page 32: 6 장 인덱스 구조

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

{{

Page 33: 6 장 인덱스 구조

33

▶ ▶ B+-B+- 트리 특성트리 특성① ① 루트의 서브트리 루트의 서브트리 : 0, 2, : 0, 2, m/2 m/2 m ∼ m ∼

② ② 노드의 서브트리 노드의 서브트리 (( 루트루트 ,, 리프제외리프제외 ) : 2 m∼) : 2 m∼

③ ③ 모든 리프는 동일 레벨모든 리프는 동일 레벨

④ ④ 리프가 아닌 노드의 키값 수 리프가 아닌 노드의 키값 수 : : 서브트리수서브트리수 -1-1

⑤ ⑤ 리프노드 리프노드 : : 데이타 화일의 순차셑 데이타 화일의 순차셑 (( 리스트로 연결리스트로 연결 ))

Page 34: 6 장 인덱스 구조

34

▶ ▶ B+-B+- 트리 연산트리 연산 연산연산

– 탐색 B+- 트리의 인덱스 셑 = m- 원 탐색 트리 리프에서 검색

– 삽입 B- 트리와 유사 오버플로우 ( 분열 ) → 부모노드 , 분열노드 모두에 키값 존재

– 삭제 리프에서만 삭제 ( 재분배 , 합병 없는 경우 ) 재분배시 : 인덱스의 키값도 삭제

Page 35: 6 장 인덱스 구조

35

트라이 트라이 (Trie)(Trie) 글자나 숫자의 위치에 의해 키값을 나타내는 자료구조글자나 숫자의 위치에 의해 키값을 나타내는 자료구조

1010 원 트라이의 노드 구조원 트라이의 노드 구조

P1P1 P1P2 P1P3 P1P4 P1P5 P1P6 P1P7 P1P8 P1P9 P1P10

0 1 2 3 4 5 6 7 8 9

Page 36: 6 장 인덱스 구조

36

▶ ▶ m-m- 원 트라이원 트라이 mm 진 트리진 트리

– m = 10 : 숫자– m = 26 : 글자

레벨 레벨 j, Pj : j j, Pj : j 번째 값이 번째 값이 PiPi 인 모든 키값을 나타내는 인 모든 키값을 나타내는 서브트리를 가리킴서브트리를 가리킴

높이 높이 = = 키 필드의 길이키 필드의 길이 최대 탐색 비용 최대 탐색 비용 키 값의 길이 키 값의 길이 균일한 탐색시간균일한 탐색시간 (( 키내의 숫자나 글자수키내의 숫자나 글자수 ))

Page 37: 6 장 인덱스 구조

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