66
© DBLAB, SNU 6 6 장 장장장 장장 장 장장장 장장

6 장 인덱스 구조

Embed Size (px)

DESCRIPTION

6 장 인덱스 구조.  인덱스 (index). 특징 화일의 레코드들에 대한 효율적 접근을 위한 조직 < 키 값 , 레코드 주소 ( 포인터 )> 쌍으로 구성 종류 키 값의 유형에 따른 인덱스 기본 인덱스 (primary index) : 키 값이 기본 키인 인덱스 보조 인덱스 (secondary index) : 기본 인덱스 이외의 인덱스 화일 조직에 따른 인덱스 집중 인덱스 (clustered index) : 화일의 데이타 레코드들의 물리적 순서와 인덱스 엔트리 순서가 동일한 인덱스 - PowerPoint PPT Presentation

Citation preview

Page 1: 6 장 인덱스 구조

© DBLAB, SNU

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

Page 2: 6 장 인덱스 구조

2© DBLAB, SNU

인덱스인덱스 (index)(index) 특징특징

– 화일의 레코드들에 대한 효율적 접근을 위한 조직– < 키 값 , 레코드 주소 ( 포인터 )> 쌍으로 구성

종류종류

– 키 값의 유형에 따른 인덱스 기본 인덱스 (primary index) : 키 값이 기본 키인 인덱스 보조 인덱스 (secondary index) : 기본 인덱스 이외의 인덱스

– 화일 조직에 따른 인덱스 집중 인덱스 (clustered index) : 화일의 데이타 레코드들의 물리적 순서와 인덱스 엔트리 순서가 동일한 인덱스 비집중 인덱스 (unclustered index) : 집중 형태가 아닌 인덱스

– 데이타 범위에 따른 인덱스 밀집 인덱스 (dense index) : 데이타 레코드 하나에 하나의 인덱스 엔트리가 만들어지는 인덱스 . 역 인덱스 (inverted index) 희소 인덱스 (sparse index) : 데이타 레코드 그룹 또는 데이타 블록에 하나의 엔트리가 만들어지는 인덱스

Page 3: 6 장 인덱스 구조

3© DBLAB, SNU

이원 탐색 트리 이원 탐색 트리 (binary search tree)(binary search tree) 인덱스를 조직하는 한가지 방법인덱스를 조직하는 한가지 방법 이진 트리이진 트리 (binary tree)(binary tree)

– 유한한 수의 노드를 가진 트리– 공백 (empty) 이거나 루트와 두 개의 분리된 이진 트리 즉 , 왼쪽 서브트리 (left subtree) 와 오른쪽 서브트리 (right subtree) 로

구성

이원 탐색 트리이원 탐색 트리– 이진 트리– 각 노드 Ni 는 레코드 키 Ki 와 이 키를 가지고 있는 레코드 포인터를 포함– 공백이 아닌 이원 탐색 트리의 성질

모든 노드는 상이한 키 값들을 갖는다 . 루트 노드 Ni 의 왼쪽 서브트리 (Left(Ni)) 에 있는 모든 노드의 키 값들은 루트 노드의 키 값보다 작다 . 루트 노드 Ni 의 오른쪽 서브트리 (Right(Ni)) 에 있는 모든 노드의 키 값들은 루트 노드의 키 값보다 크다 . 왼쪽 서브트리와 오른쪽 서브트리는 모두 이원 탐색 트리이다 .

Page 4: 6 장 인덱스 구조

4© DBLAB, SNU

이원 탐색 트리이원 탐색 트리 이진 트리와 이원 탐색 트리이진 트리와 이원 탐색 트리

그림 (a): 이원 탐색 트리가 아님 그림 (b), (c): 이원 탐색 트리

28

12 32

10 14 30

15

11 70

5

30

42

37 44

(a) (b) (c)

Page 5: 6 장 인덱스 구조

5© DBLAB, SNU

▶ ▶ 이원 탐색 트리에서의 검색이원 탐색 트리에서의 검색

루트 노드가 루트 노드가 NNii 인 이원 탐색 트리에서인 이원 탐색 트리에서 키 값이 키 값이 KK 인인 노드를 검색하는 방법노드를 검색하는 방법

1. 트리가 공백 : 검색 실패2. K=Ki : 노드 Ni 가 원하는 노드3. K<Ki : Ni 의 왼쪽 서브트리를 검색 , 즉 Ni ← Root(Left(Ni)) 로 하여 다시 검색 시작1. K>Ki : Ni 의 오른쪽 서브트리를 검색 즉 , Ni ← Root(Right(Ni)) 로하여 다시 검색 시작

Page 6: 6 장 인덱스 구조

6© DBLAB, SNU

▶ ▶ 이원 탐색 트리에서의 검색이원 탐색 트리에서의 검색 연결 리스트로 표현된 이원 탐색 트리에서의 검색연결 리스트로 표현된 이원 탐색 트리에서의 검색

노드는 key, left, right 필드로 구성

searchBST(B, s_key) // B 는 이원 탐색 트리 , s_key 는 검색 키 값       p ← B;       if (p = null) then     // 공백 이진 트리로 실패           return null;       if (p.key = s_key) then   // 검색 성공           return p;       if (p.key < s_key) then    //  오른쪽 서브트리 검색           return searchBST(p.right, s_key);       else return searchBST(p.left, s_key);  // 왼쪽 서브트리 검색 end searchBST()

Page 7: 6 장 인덱스 구조

7© DBLAB, SNU

▶ ▶ 이원 탐색 트리에서의 삽입이원 탐색 트리에서의 삽입 루트 노드가 루트 노드가 NNii 인 이원 탐색 트리에 키 값이 인 이원 탐색 트리에 키 값이 KK 인 인

노드를 삽입노드를 삽입1. 트리가 공백 : K 를 루트 노드로 삽입2. K=Ki : 트리에 똑같은 키 값이 이미 존재하므로 삽입을 거부3. K<Ki : Ni 의 왼쪽 서브트리로 이동하여 계속 탐색4. K>Ki : Ni 의 오른쪽 서브트리로 이동하여 계속 탐색5. K 가 있어야 할 위치에 없어서 탐색이 실패로 끝나는 위치에 키 값이 K 인 노드를 삽입

– 삽입 예 : 키 값 13, 50 을 삽입15

11 70

5

(a) 이원 탐색 트리

15

11 70

5 13

(b) 키값 13을 삽입

15

11 70

5 13

(c) 키값 50을 삽입

50

Page 8: 6 장 인덱스 구조

8© DBLAB, SNU

▶ ▶ 이원 탐색 트리에서의 삽입 이원 탐색 트리에서의 삽입 알고리즘알고리즘

insertBST(B, new_key) // B 는 이원 탐색 트리 , new_key 는 삽입할 키 값      p ← B;      while (p ≠ null) do { // 삽입하려는 키 값을 가진 노드가 이미 있는지 검사          if (new_key = p.key) then return;             q ← p;     // q 는 p 의 부모 노드를 지시          if (new_key < p.key) then p ← p.left;          else p ← p.right;      }      newNode ← getNode(); // 삽입할 노드를 만듦      newNode.key ← new_key;      newNode.right ← null;      newNode.left ← null;      if (B = null) then B ← newNode;      // 트리가 공백인 경우      else if (new_key < q.key) then // q 는 탐색이 실패로 종료하게 된 원소             q.left ← newNode;       else q.right ← newNode;      return; end insertBST()

Page 9: 6 장 인덱스 구조

9© DBLAB, SNU

▶ ▶ 이원 탐색 트리에서의 삭제이원 탐색 트리에서의 삭제 노드를 삭제한 뒤에도 트리는 계속 이원 탐색 트리의 성질을노드를 삭제한 뒤에도 트리는 계속 이원 탐색 트리의 성질을 유지해야 됨유지해야 됨 삭제할 노드의 자식 수에 따라 상이한 삭제 연산삭제할 노드의 자식 수에 따라 상이한 삭제 연산

1. 자식이 없는 리프 노드의 삭제 단순히 그 노드를 삭제

2. 자식이 하나인 노드의 삭제 삭제되는 노드 자리에 그 자식 노드를 위치

3. 자식이 둘인 노드의 삭제 삭제되는 노드 자리에 왼쪽 서브트리에서 제일 큰 키 값이나 또는 오른쪽 서브트리에서 제일 작은 키 값으로 대체 해당 서브트리에서 대체 노드를 삭제

삭제는 포인터 값의 조정으로 구조 변경삭제는 포인터 값의 조정으로 구조 변경

삭제 표시삭제 표시 (( 논리적 삭제논리적 삭제 )) 로 대체 가능로 대체 가능– 물리적으로 즉각 삭제하지 않는 경우

다만 검색 , 삽입 시 : 삭제된 노드의 키 값을 참고로 이용 가능 정상적 키 값이 아니므로 특별 취급이 필요

Page 10: 6 장 인덱스 구조

10© DBLAB, SNU

▶ ▶ 이원 탐색 트리에서의 삭제이원 탐색 트리에서의 삭제 삭제 예 삭제 예 : : 키 값 키 값 40, 20, 50 40, 20, 50 삭제삭제

50

30 55

20 40 52 60

25

50

30 55

20 52 60

25

(a) 삭제 전 (b) 삭제 후

이원 탐색 트리에서 리프 노드 (40) 의 삭제

50

30 55

20 52 60

25

50

30 55

25 52 60

(a) 삭제 전 (b) 삭제 후

이원 탐색 트리에서 자식이 하나인 노드 (20) 의 삭제

30

25 55

52 60

52

30 55

6025

(b) 왼쪽 서브트리의최대 키 값 (30) 으로 대체

(c) 오른쪽 서브트리의최소 키 값 (52) 으로 대체

30

25

55

52 60

50

(a) 삭제 전

이원 탐색 트리에서 자식이 둘인 노드 (50) 의 삭제

Page 11: 6 장 인덱스 구조

11© DBLAB, SNU

▶ ▶ 이원 탐색 트리에서의 삭제 이원 탐색 트리에서의 삭제 알고리즘알고리즘

deleteBST(B, d_key)     p ← node to be deleted;          // 삭제할 키 d_key 를 가진 노드     parent ← parent node of p;      // 삭제할 노드의 부모 노드     if (p = null) then return;         // 삭제할 원소가 없음     case { p.left=null and p.right=null : // 삭제할 노드가 리프 노드인 경우               if (parent.left = p) then parent.left ← null;               else parent.right ← null;          p.left=null or p.right = null : // 삭제할 노드의 차수가 1 인 경우               if (p.left ≠ null) then { if (parent.left = p) then parent.left ← p.left;                   else parent.right ← p.left; }               else { if (parent.left = p) then parent.left ← p.right;                   else parent.right ← p.right; }          p.left ≠ null and p.right ≠ null :   // 삭제할 노드의 차수가 2 인 경우                   q←maxNode(p.left);   // 왼쪽 서브트리에서 최대 키 값을 탐색             p.key ← q.key;                   deleteBST(p.left, p.key);     } end deleteBST()

Page 12: 6 장 인덱스 구조

12© DBLAB, SNU

▶ ▶ 편향 이원 탐색 트리편향 이원 탐색 트리

편향 이원 탐색 트리편향 이원 탐색 트리 (skewed binary search tree)(skewed binary search tree)– 리프 노드의 탐색 시간은 최악– N 개의 노드로 구성된 이원 탐색 트리에서 최악의 탐색

시간 : N 번의 노드 탐색

60

55

52

30

25

25

30

52

55

60

Page 13: 6 장 인덱스 구조

13© DBLAB, SNU

▶ ▶ 이원 탐색 트리의 성능이원 탐색 트리의 성능 성능성능

– 이원 탐색 트리의 성능은 트리의 형태와 노드에 대한 접근 빈도에 의존 – 우수한 성능을 위해서는

1. 가장 자주 접근되는 노드는 루트에 가장 가깝게 유지2. 이원 탐색 트리를 균형 트리 (balanced tree) 로 유지

모든 노드에 대해 양쪽 서브트리의 노드 수가 가능한 똑같게 만들어 트리의 최대 경로 길이를 최소화

이원 탐색 트리의 단점이원 탐색 트리의 단점– 삽입 , 삭제 후 효율적 접근을 위한 균형 유지 부담이 큼– 작은 분기율 (branching factor) 에 따른 긴 탐색 경로와

검색 시간 분기율이 2: 각 노드는 많아야 두 개의 서브트리 N 개의 노드를 갖는 트리의 최소 높이 : 1log N

Page 14: 6 장 인덱스 구조

14© DBLAB, SNU

AVL AVL 트리트리 19621962 년 러시아 수학자 년 러시아 수학자 Adelson-VelskiiAdelson-Velskii 와 와 LandisLandis 가 고안한가 고안한 높이 균형 이진 트리 높이 균형 이진 트리 (height-balanced binary tree)

이진 트리의 높이이진 트리의 높이 : : 루트에서 어떤 리프 까지의 가장 긴루트에서 어떤 리프 까지의 가장 긴 경로의 길이경로의 길이

AVL AVL 높이 균형 이진 트리높이 균형 이진 트리– 삽입 , 삭제 , 검색 시간 : O(logN)– 트리의 일부만 재균형시키면서 트리 전체가 균형을 계속 유지할 수 있도록 함 .

AVL AVL 트리의 정의트리의 정의– 각 노드의 왼쪽 서브트리의 높이와 오른쪽 서브트리의 높이 차이가 1 이하인 이원 탐색 트리

h(Left(Ni)) – h(Right(Ni)) ≤ 1, Ni T∈– 공백 서브트리의 높이 : -1

Page 15: 6 장 인덱스 구조

15© DBLAB, SNU

▶ ▶ AVL AVL 트리트리

균형 인수균형 인수 (balance factor,BF)(balance factor,BF)

– 왼쪽 서브트리의 높이에서 오른쪽 서브트리의 높이를 뺀 수 , BF = h(Left(T)) – h(Right(T))

– 노드의 균형 인수가 ±1 이하이면 이 노드는 AVL 성질 (AVL property) 을 만족하고 ±2 이상이면 AVL 성질을 만족하지 못한다고 말함 .

– AVL 트리의 모든 노드는 균형 인수가 ±1 이하이다 . 즉 AVL 트리의 모든 노드는 이 AVL 성질을 만족하고 있다.

Page 16: 6 장 인덱스 구조

16© DBLAB, SNU

▶ ▶ AVL AVL 트리와 트리와 non-AVL non-AVL 트리트리8

106

4

8

4 12

161063

15 175 11

13

8

4 12

161063

9

(a) (b) (c)

AVL 트리

8

7

6

8

4 10

16962

14 185

12

5

3 9

742

6

(a) (b) (c)

non-AVL 트리

Page 17: 6 장 인덱스 구조

17© DBLAB, SNU

▶ ▶ AVL AVL 트리에서의 검색과 삽입트리에서의 검색과 삽입 (1)(1)

검색검색– 일반 이원 탐색 트리의 검색 방법과 동일– 시간 복잡도 : O(logN)

삽입삽입– 삽입되는 노드에서부터 루트까지의 경로에 있는 조상

노드들의 균형인수 (bf) 에 영향을 줄 수 있음

– 노드 삽입으로 AVL 트리가 non-AVL 트리가 되면 삽입된 노드와 가장 가까우면서 불균형이 된 조상 노드의 균형 인수가 ±1 이하로 되게 트리 구조를 조정해야 됨

Page 18: 6 장 인덱스 구조

18© DBLAB, SNU

▶ ▶ AVL AVL 트리에서의 검색과 삽입트리에서의 검색과 삽입 (2)(2)

노드 삽입으로 균형 인수가 노드 삽입으로 균형 인수가 ± 2± 2 로 된 노드 로 된 노드 xx 가 출현가 출현– 다음 4 가지 경우 중 하나로 인해 발생 ( 노드 x 는 균형 인수가 ±2)

LL : x 의 왼쪽 자식 (L) 의 왼쪽 서브트리 (L) 에 삽입RR : x 의 오른쪽 자식 (R) 의 오른쪽 서브트리 (R) 에 삽입LR : x 의 왼쪽 자식 (L) 의 오른쪽 서브트리 (R) 에 삽입RL : x 의 오른쪽 자식 (R) 의 왼쪽 서브트리 (L) 에 삽입

12

8 16

14104

2 6

1

2

2

0 0

0

0

1

1

1

12

8 16

14104

2 6

1

1

0 0

0

1

0

0

(a) AVL 트리 (b) 원소 1 의 삽입으로 non-AVL 트리로 변환

원소 1 의 삽입으로 노드 8 의 AVL 성질 상실

Page 19: 6 장 인덱스 구조

19© DBLAB, SNU

▶ ▶ AVL AVL 트리에서의 검색과 삽입트리에서의 검색과 삽입 (3)(3) 회전회전 (rotation):(rotation): 불균형이 발생할 때 트리 구조를불균형이 발생할 때 트리 구조를 변경하여 균형을 잡아주는 것변경하여 균형을 잡아주는 것

1. 단순 회전 (single rotation) 한 번의 회전만 필요한 균형 : LL, RR 탐색 순서를 유지 하면서 부모와 자식 원소의 위치를 교환

2. 이중 회전 (double rotation) 두 번의 회전이 필요한 균형 : LR, RL

i) LL 회전

T2T1T1

B

T3

A

A2

1 0

T2 T3

B0

LL

Page 20: 6 장 인덱스 구조

20© DBLAB, SNU

▶ ▶ AVL AVL 트리에서의 검색과 삽입트리에서의 검색과 삽입 (4)(4)

ii) RR 회전

iii) LR(a) 회전

T2 T3

B

T1

A

A

-2

-1 0

T1 T2

B

0

⇒RR

T3

0B A

A

2

-1 0

C

0

LR(a)

⇒B

0

C0

Page 21: 6 장 인덱스 구조

21© DBLAB, SNU

▶ ▶ AVL AVL 트리에서의 검색과 삽입트리에서의 검색과 삽입 (5)(5)

iv) LR(b) 회전T2

C

T3

B

-1

1

LR(b)

⇒T1

A

2

T4 T2

A

T3

B

0

T1

C

0

T4

-1

v) LR(c) 회전

T3

C

T2

B

-1

-1

LR(c)

⇒T1

A

2

T4

AB

1

T1

C

0

T4

0

T2 T3

Page 22: 6 장 인덱스 구조

22© DBLAB, SNU

▶ ▶ AVL AVL 트리에서의 검색과 삽입트리에서의 검색과 삽입 (6)(6)

vi) RL(a) 회전

vii) RL(b) 회전

T3T2

B

1

⇒T4

A

-2

T1

BA

1

T1

C

0

T4

0

T2 T3

C

-1

RL(b)

B B

A

-2

-1 0

C

0

RL(a)

⇒ A0

C 0

Page 23: 6 장 인덱스 구조

23© DBLAB, SNU

▶ ▶ AVL AVL 트리에서의 검색과 삽입트리에서의 검색과 삽입 (7)(7)

viii) RL(c) 회전

AVL 트리 회전

T2 T3

B

1RL(c)

⇒T4

A

-2

T1

BA

0

T1

C

0

T4

-1

T3T2

C

1

Page 24: 6 장 인덱스 구조

24© DBLAB, SNU

▶ ▶ AVL AVL 트리에서의 검색과 삽입트리에서의 검색과 삽입 (8)(8)– 키 리스트 (8, 9, 10, 2, 1, 5, 3, 6, 4, 7, 11, 12) 를 차례대로 삽입하면서 AVL 트리를 구축하는 예

8

9

-1

08

9

10

9

108-1

-2 0

0

0 0RR

9

108

1

1 0

2

0

9

108

2

2 0

2

1

1

0

9

102

1

0 0

1

0

80

LL

(a) 키 8 삽입 (b) 키 9 삽입 (c) 키 10 삽입

(d) 키 2 삽입(e) 키 1 삽입

80

Page 25: 6 장 인덱스 구조

25© DBLAB, SNU

▶▶ 노드 삽입에 따른 균형 인수노드 삽입에 따른 균형 인수 (BF)(BF) 조정조정

노드 삽입으로 인한 균형 인수노드 삽입으로 인한 균형 인수 (BF)(BF) 의 변화의 변화– 새로 노드를 삽입할 때 BF 에 영향을 받는 노드는 오직 이 새로운 노드에서부터 루트까지의 경로상에 있는 노드들이다 .

– 새로운 노드를 왼쪽 서브트리로 삽입하면 그 부모 노드의 BF 를 하나 증가 (+1) 시키고 오른쪽 서브트리로 삽입하면 BF 를 하나 감소 (-1) 시킨다 .

– 이때 이 BF 가 0 이 되면 BF 조정은 종료되고 아니면 다시 그의 부모 노드의 BF 를 변경한다 . 즉 , 자기가 부모

노드의 왼쪽 서브트리이면 BF 를 하나 증가 (+1) 시키고 오른쪽 서브트리이면 BF 를 하나 감소 (-1) 시키면서 루트까지의 경로를 따라가면서 BF 조정 작업을 계속한다 .

Page 26: 6 장 인덱스 구조

26© DBLAB, SNU

▶ ▶ AVL AVL 트리에서의 검색과 삽입트리에서의 검색과 삽입 (9)(9)

(f) 키 5 삽입

LR

9

102

2

-1 0

10

81

50

0

0 -1

050

100

8

92

1

-1 -1

10

51

30

100

(g) 키 3 삽입

(h) 키 6 삽입

8

92

1

-1 -1

10

50

30

100

60

8

92

2

-2 -1

10

51

3-1

100

60

40

8

93

1

0 -1

21

50

40

100

60

10

RL

(i) 키 4 삽입

1

2 9

8

Page 27: 6 장 인덱스 구조

27© DBLAB, SNU

▶ ▶ AVL AVL 트리에서의 검색과 삽입트리에서의 검색과 삽입 (10)(10)

(k) 원소 11 삽입

8

3 9

1052

1 64

7

1 0

-1

0

00

2

-1

-1

-1LR

5

3 8

942

1 7 10

1 -1

0

00

0

1

0

06-1

(j) 원소 7 삽입

5

3 8

942

1 7 10

1 -2

-1

-10

-1

1

0

06-1

110

5

3 8

1042

1 7 11

1 0

0

00

0

1

0

06-1

90

RR

Page 28: 6 장 인덱스 구조

28© DBLAB, SNU

▶ ▶ AVL AVL 트리에서의 검색과 삽입트리에서의 검색과 삽입 (11)(11)

(l) 키 12 삽입

5

3 8

1042

1 7 11

1 -1

-1

-10

-1

1

0

0

6

-1

9

0

120

Page 29: 6 장 인덱스 구조

29© DBLAB, SNU

▶ ▶ AVL AVL 트리에서의 삽입 알고리즘트리에서의 삽입 알고리즘 (1)(1) /* AVL 트리 삽입 알고리즘 */insertAVL(new_key) if (root = new_key) then { // 공백 트리인 경우 y ← getTreeNode(); y.key ← newKey;

root ←y; root.bf ← 0; //bf 는 균형 인수 root.left ← null; root.right ← null; return true; } f ← null; a ← p ← root; q ← null; found ← false;

// phase 1: new_key 의 삽입 위치 (q) 조사 while (p ≠ null and found = false) do if (p.bf ≠ 0) then {a ← p; f ← q;} if (new_key < p.key) then {q ← p; p ← p.left;} // 왼쪽 서브트리로 이동 else if (new_key > p.key) then {q ← p; p ← p.right;} // 오른쪽 서브트리로 이동 else {y ← p; found ← true;} } // while

// phase 2: new_key 를 삽입하고 균형화

Page 30: 6 장 인덱스 구조

30© DBLAB, SNU

▶ ▶ AVL AVL 트리에서의 삽입 알고리즘트리에서의 삽입 알고리즘 (2)(2)

// phase 2: new_key 를 삽입하고 균형화if (found = false) then { // new_key 는 트리에 없음 . // new_key 를 q 의 적절한 자식으로 삽입 y ← getTreeNode(); y.key ← newKey; y.left ← null; y.right ← null; y.bf ← 0; if (new_key < q.key) then q.left ← y; //q 의 왼쪽 자식으로 삽입 else q.right ← y; //q 의 오른쪽 자식으로 삽입

// a 에서 q 까지의 경로에 있는 노드의 균형 인수를 조정 . // a 의 정의에 따라 이 경로상에 있는 모든 노드들은 그 // 균형 인수가 0 이어야 되기 때문에 이들의 균형 인수는 // ±1 로 변경된다 . 따라서 // d=1 은 new_key 가 a 의 왼쪽 서브트리로 삽입되었다는 // 것을 의미하고 // d=-1 은 a 의 오른쪽 서브트리로 삽입되었다는 것을 // 의미한다 .

Page 31: 6 장 인덱스 구조

31© DBLAB, SNU

▶ ▶ AVL AVL 트리에서의 삽입 알고리즘트리에서의 삽입 알고리즘 (3)(3) if (new_key > a.key) then {p ←a.right; b ← p; d ← -1;} else {p ←a.left; b ← p; d ← 1;} while (p ≠ y) do { if (new_key > p.key) then {p.bf← -1; p ← p.right;} // 오른쪽 서브트리의 높이가 1 증가 else {p.bf← 1; p ← p.left;} // 왼쪽 서브트리의 높이가 1 증가 } //while (p ≠ y) unbalanced ← true; // 트리가 불균형인지를 검사 if (a.bf = 0 or a.bf+d = 0) then // 트리가 아직 균형 {a.bf ← a.bf+d; unbalanced ← false; } if (unbalanced = true) then // 트리가 불균형 . 회전 유형을 결정 if (d = 1) then { // 왼쪽 불균형 if (b.bf = 1) then { // LL 회전 타입 a.left ← b.right; b.right ←a; a.bf ← 0; b.bf ← 0;} } else { // LR 회전 타입 c ←b.right; b.right ← c.left; a.left ← c.right; c.left ←b; c.right ← a; switch (c.bf) { case 1 : a.bf ← -1; b.bf ← 0; break; //LR(b) case -1 : b.bf ← 1; a.bf ← 0; break; //LR(c) case 0 : b.bf ← 0; a.bf ← 0; break; //LR(a) } c.bf ← 0; b ← c; // b 는 새로운 루트 } // else LR 회전 타입

Page 32: 6 장 인덱스 구조

32© DBLAB, SNU

▶ ▶ AVL AVL 트리에서의 삽입 알고리즘트리에서의 삽입 알고리즘 (4)(4)

if (unbalanced = true) then // 트리가 불균형 . 회전 유형을 결정 if (d = 1) then { // 왼쪽 불균형 if (b.bf = 1) then { // LL 회전 타입

************ } else { // LR 회전 타입

************

} // else LR 회전 타입 } // 왼쪽 불균형 else { // 오른쪽 불균형 . 왼쪽 불균형의 대칭 코드

……………..// RR 회전 타입

……………..// RL 회전 타입 } if (f = null) then root ← b; // b 를 루트로하는 서브트리가 // 균형을 맞추고 새로운 서브트리가 됨 else if (a = f.left) then f.right ← b;} // if (unbalanced = true) return true;

} // if (found = false return false;

end insertAVL()end insertAVL()

Page 33: 6 장 인덱스 구조

33© DBLAB, SNU

▶ ▶ AVL AVL 트리의 높이트리의 높이 높이 균형 이진 트리의 높이높이 균형 이진 트리의 높이

– N 개의 노드를 가진 높이 균형 이진 트리는 완전 균형 이진 트리보다 45% 이상 높아지지 않음

– log(N+1) ≤ h ≤ 1.4404log(N+2)-0.328

높이 균형 이진 트리 대 완전 균형 이진 트리높이 균형 이진 트리 대 완전 균형 이진 트리– O (1.4 log N) 대 O (log N)– 높이 균형 이진 트리의 탐색 시간이 더 길다

이유 : 트리의 전체 재균형을 수행하지 않기 때문

수 백만 개의 노드로 구성된 수 백만 개의 노드로 구성된 AVLAVL 트리가 디스크에트리가 디스크에 저장된 상태에서의 노드 탐색은 많은 횟 수의 디스크저장된 상태에서의 노드 탐색은 많은 횟 수의 디스크 접근을 요구한다접근을 요구한다 . . 그래서 그래서 m-m- 원 탐색 트리를 원 탐색 트리를

고려하게고려하게 된다된다 ..

Page 34: 6 장 인덱스 구조

34© DBLAB, SNU

m-m- 원 탐색 트리원 탐색 트리 (m-way search tree)(m-way search tree)

이원 탐색 트리보다 높은 분기율이원 탐색 트리보다 높은 분기율 : : mm 개 서브트리개 서브트리– 장점 : 트리의 높이가 감소 ( 특정 노드의 탐색 시간 감소 )– 단점 : 삽입 , 삭제시 트리의 균형 유지를 위해 복잡한 연산이 필요

m-m- 원 탐색 트리의 성질원 탐색 트리의 성질 ① 노드 구조는 <n, P0, K1, P1, K2, P2, … , Pn-1, Kn, Pn>

(n: 키 값 수 , 1≤n<m, Pi: 서브트리에 대한 포인터 , Ki: 키 값 )

② 한 노드에 있는 키 값들은 오름차순 : Ki < Ki+1 , 1 ≤ i ≤ n-1

③ Pi (0 ≤ i ≤ n-1) 가 지시하는 서브트리 모든 노드들의 키 값 < Ki+1

④ Pn 이 지시하는 서브트리의 모든 노드들의 키값 > Kn

⑤ Pi 가 지시하는 서브트리는 m- 원 서브트리

Page 35: 6 장 인덱스 구조

35© DBLAB, SNU

▶ ▶ 3-3- 원 탐색 트리원 탐색 트리

25

★ 키 값 Ki: (Ki, Ai)를 의미하고 ,

Ai 는 키 값 Ki 를 포함하고 있는 데이타 레코드의 주소

180

a

b c d

e f g h i j

100 140

30 60 110 120 170 200

70 90 150 160 22010 20^ ^ 40 50^ ^

55

Page 36: 6 장 인덱스 구조

36© DBLAB, SNU

▶ ▶ m-m- 원 탐색 트리의 검색원 탐색 트리의 검색

searchMT(key)  // m- 원 탐색 트리의 검색 알고리즘 // key : 검색 키 값 // x : 노드 (<n, P0, K1, P1, K2, P2, … , Pn-1, Kn, Pn>) // root : 루트 노드 // n : 노드에 있는 키의 개수

x ← root; while( x != null ) do { i ← 1; n ← x.n;  while( i <= n && key > x.Ki )

i ← i+1; if ( i <= x.n && key = x.Ki) then return Ai;    // 키 값 key 를 가진 레코드의 주소를 반환 if (i > n) then x ← x.Pn

else x ← x.Pi-1

} //while return null;  // key 와 일치하는 값이 트리에 없는 경우 end searchMT()

Page 37: 6 장 인덱스 구조

37© DBLAB, SNU

▶ ▶ m-m- 원 탐색 트리의 분석원 탐색 트리의 분석 m-m- 원 탐색 트리의 탐색시간원 탐색 트리의 탐색시간 : : 탐색 경로 길이탐색 경로 길이 (( 높이높이 ))

에 비례에 비례– 각 레벨에서는 한 개의 노드만 탐색– 분기율 (m) 을 최대로 하면 트리의 높이가 낮아짐

한 노드에 한 노드에 m-1m-1 개 키 값을 저장하는 개 키 값을 저장하는 m-m- 원원 탐색트리 탐색트리– 높이 h : n = (mh-1) 개 키 값 저장

( 예 ) 4- 원 탐색 트리 : 높이가 3 이면 n=(43-1)=63 개의 키 값을 저장

nn 개의 키를 가진 개의 키를 가진 m-m- 원 탐색트리원 탐색트리– 최소 높이 h = logm(N+1) – 최대 탐색 시간 : O (logm(N+1))

(( 예예 ) m=2) m=2 이면 이면 : : 이진 트리 탐색시간이진 트리 탐색시간

Page 38: 6 장 인덱스 구조

38© DBLAB, SNU

B-B- 트리트리 19721972 년 년 Bayer & McCreightBayer & McCreight 가 제안가 제안

균형 균형 m-m- 원 탐색 트리 원 탐색 트리 – 가장 많이 사용되는 인덱스 방법– 효율적인 균형 알고리즘을 제공

차수차수 (order)(order) 가가 mm 인 인 B-treeB-tree 의의 특성 특성 ① ① B-B- 트리는 공백이거나 높이가 트리는 공백이거나 높이가 1 1 이상인 이상인 m-m- 원 탐색 트리원 탐색 트리 ② ② 루트와 리프를 제외한 내부 노드루트와 리프를 제외한 내부 노드

- - 최소 최소 m/2 m/2 , , 최대 최대 mm 개의 서브트리개의 서브트리- - 적어도 적어도 m/2 m/2 - 1 - 1 개의 키 값개의 키 값 (( 노드의 반 이상이 노드의 반 이상이

채워짐채워짐 )) ③ ③ 루트 루트 : : 리프가 아니면 적어도 두 개의 서브트리를 가짐리프가 아니면 적어도 두 개의 서브트리를 가짐 ④ ④ 모든 리프는 같은 레벨모든 리프는 같은 레벨

Page 39: 6 장 인덱스 구조

39© DBLAB, SNU

▶ ▶ mm 차 차 B-B- 트리 노드 구조트리 노드 구조 노드 구조노드 구조

< n, p0, <K1, A1>, P1, <K2, A2>, P2, … , Pn-1, <Kn, An>, Pn>

① n : 키 값의 수 (1≤n<m), P0, … , Pn : 서브트리에 대한 포인터 , 각 키 값 Ki 는 그 키 값을 가진 레코드에 대한 포인터 Ai 를

포함② 각 노드의 키 값들은 항상 오름차순 (1≤i ≤n-1 Ki < Ki+1) 을 유지③ Pi 가 지시하는 서브트리의 키 값들은 모두 Ki+1 보다 작다 .④ Pn 이 지시하는 서브트리의 키 값들은 모두 Kn 보다 크다 .⑤ Pi(0≤i≤n) 가 지시하는 서브트리들은 모두 m-원 서브 탐색 트리이다 .

B-B- 트리의 장점트리의 장점– 삽입 , 삭제 뒤에도 트리의 균형 상태를 유지– 저장장치의 효율성

각 노드의 반 이상은 항상 키 값으로 채워짐

Page 40: 6 장 인덱스 구조

40© DBLAB, SNU

▶ ▶ 33 차 차 B-B- 트리 구조트리 구조

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

^

^ ^ ^ ^ ^

Page 41: 6 장 인덱스 구조

41© DBLAB, SNU

▶ ▶ B-B- 트리에서의 연산트리에서의 연산 검색 검색 : : m-m- 원 탐색 트리의 직접 검색과 같은 과정원 탐색 트리의 직접 검색과 같은 과정

– 직접 탐색 : 키 값에 따라 왼쪽 또는 오른쪽 서브트리로 분기

– 노드에서의 검색은 순차 검색 예 ) 키 값 42 검색

– B- 트리 전체의 순차 검색은 트리의 중위 순회 (inorder traversal) 로 수행

삽입 삽입 : : 새로운 키 값은 항상 리프 노드에 삽입새로운 키 값은 항상 리프 노드에 삽입– 노드에 공간이 있는 경우 : 단순히 순서에만 맞게 삽입– 노드에 공간이 없는 경우 : overflow 로 split 발생

해당 노드를 두 개의 노드로 분할 해당 노드에 새로운 키 값 삽입했다고 가정 중간 ( m/2 번째 ) 키 값을 기준으로 왼쪽 작은 키 값들은 그대로 두고 오른쪽 큰 키 값들은 새로운 노드에 저장 중간 키 값은 분할된 두 노드가 왼쪽 서브트리 , 오른쪽 서브트리가 되도록 부모 노드에 삽입 이 때 , 다시 overflow 가 발생하면 위와 같은 분할 (split) 작업을 반복

Page 42: 6 장 인덱스 구조

42© DBLAB, SNU

▶ ▶ B-B- 트리에서의 삽입트리에서의 삽입 앞의 앞의 B-B- 트리에 새로운 키 값 트리에 새로운 키 값 22, 41, 59, 57, 54, 44, 75, 22, 41, 59, 57, 54, 44, 75,

124, 122, 123 124, 122, 123 삽입삽입

20l

20l

22

(a) 노드 l에 키 22 의 삽입 (b) 리프 노드 n에 키 42 의 삽입

42n

41n

42

60f

50o

58

· · ^

b

p

58f

50o

· ·

b

o’

60

59

·p

(c) 노드 o에 키 59 의 삽입

Page 43: 6 장 인덱스 구조

43© DBLAB, SNU

▶ ▶ B-B- 트리에서의 삽입트리에서의 삽입

50o

50o

57

(d) 노드 o에 키 57 의 삽입

50o

50o

57

(d) 키 54 의 삽입으로 노드 o의 분할(54 는 부모 노드 f로 이동 )

57o’’

58f

· · 60 ·po o’

54f

· · ^

o o’’

60f’

· · ^

o’ p

(e) 노드 f에 키 54 의 삽입 (58 는 부모 노드 b에 삽입 )

Page 44: 6 장 인덱스 구조

44© DBLAB, SNU

▶ ▶ B-B- 트리에서의 삽입트리에서의 삽입

(h) 노드 a 에 키 43 의 삽입

69

b

· · ^

c

43

b

· ·b’

69 ·c

a a

19b

· · 43 ·fd e

19b

· · ^

d e

58b’

· · ^

f f’

(g) 노드 b에 키 58 의 삽입 (43 은 부모 노드 a에 삽입 )

나머지 키 값인 33, 75, 124, 122 를 차례로 삽입 : 문제가 발생하지 않음마지막 키 값인 123 을 삽입 : B- 트리는 한 레벨 증가됨

Page 45: 6 장 인덱스 구조

45© DBLAB, SNU

▶ ▶ 한 레벨 증가된 한 레벨 증가된 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 46: 6 장 인덱스 구조

46© DBLAB, SNU

▶ ▶ 33 차 차 B-B- 트리 생성 과정트리 생성 과정 키 값 키 값 43, 69, 138, 19 43, 69, 138, 19 순으로 삽입하여 생성순으로 삽입하여 생성

43

43 69

(a) 크기가 2 인 공백 루트 노드 (b) 키 값 43 의 삽입 ( 노드 1 개의 3 차 B- 트리 )

(c) 키 값 69 의 삽입 ( 노드 1 개의 3 차 B- 트리 )

69· ·

43 138

69· ·

19 13843

(d) 키 값 138 의 삽입 ( 노드 3 개의 3 차 B- 트리 )(e) 키 값 19 의 삽입 ( 노드 3 개의 3 차 B- 트리 )

Page 47: 6 장 인덱스 구조

47© DBLAB, SNU

▶ ▶ B-B- 트리에서의 삽입 알고리즘트리에서의 삽입 알고리즘 B- 트리 삽입 알고리즘

// In-key : 삽입할 키 // Finished : 삽입 완료를 나타내는 플래그 // Found : 레코드가 발견되었음을 나타내는 플래그 // P : 노드에 대한 포인터 // Bignode : 오버플로 노드를 위한 변수 // 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 48: 6 장 인덱스 구조

48© DBLAB, SNU

B-B- 트리트리if (Found) report In-key already in tree;else { // In-key 를 B- 트리에 삽입 P = null; Finished = false;

do { if (current node is not full) { put In-key in current node; // 노드 안에서 키 순서를 유지하도록 키를 정렬 Finished = true; } else { copy current node to Bignode; insert In-key and P into Bignode; In-key = center key of Bignode; current node = 1st half of Bignode; get space for new node, assign address to P; new node = 2nd half of Bignode; 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 49: 6 장 인덱스 구조

49© DBLAB, SNU

▶ ▶ B-B- 트리에서의 삭제트리에서의 삭제

1.1. 삭제할 키 값이 리프 노드에 있는 경우에는 그대로 삭제할 키 값이 리프 노드에 있는 경우에는 그대로 삭제삭제

2.2. 삭제될 키 값이 내부 노드에 있는 경우삭제될 키 값이 내부 노드에 있는 경우– 이 키 값의 후행 키 값과 교환 후 리프 노드에서 삭제

B- 트리 특성상 이 후행 키 값은 항상 리프 노드에 있음 리프 노드에서의 삭제 연산이 더 간단

– 후행 키 값 대신 선행 키 값을 사용할 수 있음

3.3. 삭제 결과로 노드의 키 값 수가 삭제 결과로 노드의 키 값 수가 B-B- 트리의 최소 키 값 트리의 최소 키 값 수수 ((m/2 m/2 - 1 - 1)) 보다 작게 되면 보다 작게 되면 underflowunderflow 가 일어나 재분배나 가 일어나 재분배나 합병을 수행 합병을 수행

Page 50: 6 장 인덱스 구조

50© DBLAB, SNU

▶ ▶ B-B- 트리에서의 삭제트리에서의 삭제

재분배재분배 (redistribution)(redistribution) 해당 노드의 오른쪽이나 왼쪽 형제 노드 중에서 최소 키 값보다

많은 수의 키 값을 가진 노드에서 키 값 하나를 차출 부모 노드에 있는 키 값을 언더플로가 일어난 노드로 이동하고 ,

이 빈 자리로 차출된 키 값을 이동 트리 구조가 변경되지 않음

합병합병 (merge)(merge) 재분배가 불가능한 경우 ( 두 형제 노드가 최소의 키 값만을 가짐

) 에 적용언더플로가 된 노드의 오른쪽 ( 또는 왼쪽 ) 형제 노드에 있는 키

값들과 이 두 노드를 분리시키는 부모 노드의 키 값을 합치고 트리 구조를 조정 . 합병으로 생긴 빈 노드는 제거

트리 구조가 변경됨 이 합병 작업은 투트 노드까지 연쇄적으로 파급될 수 있음 . 이

경우에는 트리의 레벨이 하나 감소될 수도 있음 .

Page 51: 6 장 인덱스 구조

51© DBLAB, SNU

▶ ▶ B-B- 트리에서의 삭제트리에서의 삭제 앞의 앞의 B-B- 트리에서 키 값 트리에서 키 값 58, 7, 60, 20, 15 58, 7, 60, 20, 15 삭제삭제

노드 o에서 키 값 58 의 삭제

50o

50o

58

노드 j에서 키 값 7 의 삭제

7

j

15

j

15

60f

62p

65

· ·

b

50o

62f

60p

65

· ·

b

50o

62f

65p

· ·

b

50o

노드 f에서 키 값 60 의 삭제

Page 52: 6 장 인덱스 구조

52© DBLAB, SNU

▶ ▶ B-B- 트리에서의 삭제트리에서의 삭제

30m

36

26e

20l

· ·

b

n

40

42

·36m

30e

26l

· ·

b

n

40

42

·

노드 l에서 키 값 20 의 삭제

15

j

19b

· · 43 ·30

e

· · 40 ·16· ·d

18

k

26

l

36

m

42

n

f

a

Page 53: 6 장 인덱스 구조

53© DBLAB, SNU

▶ ▶ B-B- 트리에서의 삭제트리에서의 삭제

16

jk

19b

· · 43 ·30

e

· · 40 ··d

26

l

36

m

42

n

f

a

18

16

jk

30b

· · 43 ·40

e

· ·19· ·d

26

l

36

m

42

n

f

a

18

노드 j에서 키 값 15 의 삭제

Page 54: 6 장 인덱스 구조

54© DBLAB, SNU

▶ ▶ B-B- 트리 삭제 알고리즘트리 삭제 알고리즘 B- 트리 삭제 알고리즘

// Finished : 삭제 완료를 나타내는 플래그 // Tempnode : 재분배를 위해 사용할 정상 노드 보다 50% 큰 노드 // Sibling : 인접 형제 노드 // D-key : B- 트리에서 삭제할 키

search tree for D-key forming stack of node addresses; // 탐색은 삽입 알고리즘 참조 if (D-key is not in terminal node) {

search for successor key of D-key at terminal level (stacking node addresses);

copy successor over D-key; terminal node successor now becomes the D-key;}

// 키를 삭제하고 트리를 재조정Finished = false;

Page 55: 6 장 인덱스 구조

55© DBLAB, SNU

B-B- 트리트리do { remove D-key if (current node is root or is not too small) Finished = true; else if (redistribution possible) { // Sibling > minimum 이면 재분배 // 재분배 실행 copy "best" Sibling, intermediate parent key, and current (too-small) node into Tempnode; copy keys and pointers from Tempnode to "best" Sibling, parent, and current node so Sibling and current node are roughly equal size; Finished = true; } else { // 적절한 Sibling 과 합병 choose best Sibling to concatenate with; put in the leftmost of the current node and 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 D-key; } } while (!Finished);if (no keys in root) { // 트리의 레벨을 하나 감소 new root is the node pointed to by the current root; discard old root;

}

Page 56: 6 장 인덱스 구조

56© DBLAB, SNU

B*-B*- 트리트리

B-B- 트리의 문제점트리의 문제점– B- 트리 구조 유지를 위해 추가적인 연산이 필요

삽입시 노드의 분할이나 재분배 , 삭제시 노드의 합병이나 재분배– B*- 트리는 B- 트리의 성능 개선을 위해 Knuth 가 제안한 B- 트리의 한 변형

B*-B*- 트리트리① 공백이거나 높이가 1이상인 m-원 탐색 트리② 루트는 리프가 아닌 이상 최소 2개 , 최대 2(2m-2)/3+1 개의 서브트리를 갖는다 .③ 루트와 리프를 제외한 노드는 적어도 (2m-2)/3+1개의 서브트리 , 즉 최소 (2m-2)/3 개의 키 값을 갖는다 .④ 모든 리프는 같은 레벨에 있다 .

Page 57: 6 장 인덱스 구조

57© DBLAB, SNU

B*-B*- 트리트리

삽입으로 인한 노드 분할의 빈도를 축소삽입으로 인한 노드 분할의 빈도를 축소– 노드가 오버플로 되면 즉시 분할하는 대신1. 오버플로가 된 키 값과 포인터를 바로 인접한 형제

노드의 여유공간을 이용해 재분배2. 인접 형제 노드가 모두 만원이면 두 인접 형제 노드의

키 값들을 3 개의 노드로 분할 한 노드가 만원이 되더라도 다른 인접 형제 노드가 만원이 될 때까지 분할은 지연 각 내부 노드는 항상 2/3 이상 키 값으로 채워짐

같은 키 값의 수에 대해 같은 키 값의 수에 대해 B-B- 트리 보다 적은 수의 트리 보다 적은 수의 노드가 필요노드가 필요

Page 58: 6 장 인덱스 구조

58© DBLAB, SNU

▶ ▶ 77 차 차 B*-B*- 트리의 생성트리의 생성

10 20 30 40 50 60 70 80

(a) 8 개의 키 값 삽입으로 만원이 된 7 차 B*- 트리 루트 노드 (7 차에 대한 노드 분할을 위해서는 8 개의 키 값을 갖는 루트 노드 크기가

필요 )

50

10 20 30 40 60 70 80 90

(b) 키 값 90 의 삽입으로 루트 노드가 최초로 분할된 7 차 B*- 트리

Page 59: 6 장 인덱스 구조

59© DBLAB, SNU

▶ ▶ B*-B*- 트리에서의 삽입트리에서의 삽입 오버플로가 발생하면 인접 형제 노드에 여유 공간이 오버플로가 발생하면 인접 형제 노드에 여유 공간이

있는지 검사있는지 검사 . . 여유공간이 있으면 여유공간이 있으면 – 오버플로 키 값을 부모 노드로 올려 보내고 부모 노드에 있던 분리 키 값을 형제 노드로 이동시키거나 또는– 오버플로가 된 노드와 인접 형제 노드의 키 값에다 분리 키 값을 포함해서 이들을 균등하게 양분해서 저장하고 중간 키 값을 분리 키 값으로 부모 노드에 저장

여유공간이 없으면여유공간이 없으면– 만원이 된 두 인접 형제 노드의 키 값들을 부모 노드의 분리 키 값과 함께 3 개의 노드로 분할해서 각 노드의

키 값 수가 적어도 (2m-2)/3 이 되도록 재분배한다 . 이때 2

개의 키 값은 분리 키 값으로 부모 노드에 저장된다 .

Page 60: 6 장 인덱스 구조

60© DBLAB, SNU

▶ ▶ 55 차 차 B*-B*- 트리에서의 삽입트리에서의 삽입 재분배를 이용한 키 값 재분배를 이용한 키 값 2424 의 삽입의 삽입 (( 노드 노드 q)q)

q

· · · · ·18 20 22 26

s

· · ·35 37

r

· ·33

q

· · · · ·18 20 22 24

r

· ·26

s

· · · ·33 35 37

Page 61: 6 장 인덱스 구조

61© DBLAB, SNU

▶ ▶ 55 차 차 B*-B*- 트리에서의 삽입트리에서의 삽입 노드 분할을 이용한 키 값 노드 분할을 이용한 키 값 2323 의 삽입의 삽입 (( 노드 노드 q)q)

q

· · · · ·18 20 22 24

r

· ·26

s

· · · · ·33 35 37 39

r

· · ·22 33

· · ·18 20

q

q’

· · · ·23 24 26

s

· · · ·35 37 39

Page 62: 6 장 인덱스 구조

62© DBLAB, SNU

▶ ▶ B*-B*- 트리에서의 삭제트리에서의 삭제

B-B- 트리에서의 삭제와 비슷트리에서의 삭제와 비슷 . . 키 값 삭제로 최소 키 값 키 값 삭제로 최소 키 값 수가 유지되지 않으면 수가 유지되지 않으면 1. 형제 노드로 부터 재분배를 받도록 시도2. 형제 노드에 여유 키 값이 없으면 3 개의 노드를 2 개의

노드로 합병 합병으로 인해 트리의 높이가 한 레벨 낮아질 수 있음 .

Page 63: 6 장 인덱스 구조

63© DBLAB, SNU

트라이 트라이 (Trie)(Trie) Trie: reTRIEvalTrie: reTRIEval 의 약자의 약자 키를 구성하는 문자나 숫자의 순서를 이용해 키 값을 검색할 키를 구성하는 문자나 숫자의 순서를 이용해 키 값을 검색할

수 있는 자료 구조수 있는 자료 구조– m- 진 트리이지만 m- 원 탐색 트리는 아님 : 키 값의 배열 순서가

다름

mm 진 트라이진 트라이 (m-ary trie)(m-ary trie)– 차수 m : 키 값을 표현하기 위해 사용하는 문자의 수 , 즉 기수 (radix

) 숫자 : 기수가 10 이므로 m=10, 영문자 : m = 26

– m 진 트라이 : m 개의 포인터를 표현하는 1 차원 배열 각 원소 ( 포인터 ) 는 기수의 원소에 1:1 로 대응 (p0 는 0, p5 는 5)

1010 진 트라이의 노드 구조진 트라이의 노드 구조P1P0 P1P1 P1P2 P1P3 P1P4 P1P5 P1P6 P1P7 P1P8 P1P9

0 1 2 3 4 5 6 7 8 9

Page 64: 6 장 인덱스 구조

64© DBLAB, SNU

트라이 트라이 (Trie)(Trie) 트라이의 높이 트라이의 높이 = = 키 필드의 길이키 필드의 길이 1010 진 트라이의 레벨 진 트라이의 레벨 jj 의 포인터 의 포인터 ppii 는 는 jj 번째 숫자가 번째 숫자가 ii 인 인 모든 키 값을 나타내는 서브트라이를 가리킴모든 키 값을 나타내는 서브트라이를 가리킴 ..

– 레벨 3 에 있는 p4 는 키 값의 3 번째 숫자가 4 인 키 값을 가진

서브트라이를 가리킴 .– 해당 숫자가 없을 때는 널 포인터로 표시

키 값키 값 : : 루트 노드의 루트 노드의 ppii 에서 리프 노드의 에서 리프 노드의 ppjj 까지의 경로를까지의 경로를 각 포인터에 대응하는 기수 원소로 표현한 것각 포인터에 대응하는 기수 원소로 표현한 것 .. 리프 노드에는 해당 키 값을 가진 레코드의 주소가 리프 노드에는 해당 키 값을 가진 레코드의 주소가 저장됨저장됨 키 검색 뿐만 아니라 키의 존재 유무를 빠르게 결정키 검색 뿐만 아니라 키의 존재 유무를 빠르게 결정 트라이에서 널 포인터만 가지고 있는 공백 노드는 트라이에서 널 포인터만 가지고 있는 공백 노드는 생성하지 않음생성하지 않음 ..

Page 65: 6 장 인덱스 구조

65© DBLAB, SNU

▶ ▶ 높이가 높이가 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

Page 66: 6 장 인덱스 구조

66© DBLAB, SNU

▶ ▶ mm 진 트라이 연산진 트라이 연산 검색검색

– 검색은 리프에서 종료되거나 , 키 값이 없을 때 중간 노드에서 종료– 검색 속도는 키 필드의 길이 ( 트라이의 높이 ) 에 비례– 최대 검색 비용 은 키 필드의 길이– 장점 : 균일한 탐색시간– 선호 이유 : 없는 키에 대한 빠른 검색

삽입삽입– 새로운 키 값이 삽입되어야 할 노드를 검색– 리프 노드에 새 레코드의 주소나 존재 표시를 삽입– 리프 노드가 없을 때 : 새 리프 노드를 생성하고 중간 노드를 첨가

노드의 첨가나 삭제는 있으나 분열이나 병합은 없음

삭제삭제– 노드와 원소들을 찾아서 널 값으로 변경– 노드의 원소 값들이 모두 널 ( 공백 노드 ) 인 경우에는 노드 삭제