• 검색 결과가 없습니다.

검색 트리 (Search Tree) #2

N/A
N/A
Protected

Academic year: 2022

Share "검색 트리 (Search Tree) #2"

Copied!
36
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

검색 트리 (Search Tree) #2

알고리즘

교재: 쉽게 배우는 알고리즘: 관계 중심의 사고법 저자: 문병로

출판사: 한빛미디어, 2013년 발행

(2)

수업 목표

이진검색트리의 균형이 작업의 효율성에 미치는 영향을 이해하고, 레드블랙트리의 원리를 이해한 다.

B‐트리의 도입 동기를 이해하고 검색∙삽입∙삭제 작

업의 원리를 이해한다.

(3)

이진탐색트리(BST)의 탐색 시간

평균 탐색 시간: O(logn)

최악 탐색 시간: O(n)

1

2

3

4

5

6

(4)

Red‐Black Tree (RB Tree)

BST의 모든 노드에 블랙 또는 레드의 색을 칠하되 다음의

레드블랙특 성을 만족해야 한다. (RBT: 균형잡힌 이진검색 트리)

루트는 블랙이다.

모든 리프는 블랙이다.

노드가 레드이면 그 노드의 자식은 반드시 블랙이다. (하지만 블랙 노드

의 자식이 레드일 필요는 없다.)

루트 노드에서 임의의 리프 노드에 이르는 경로에서 만나는 블랙 노드의

수는 모두 같다

 여기서 리프 노드는 일반적인 의미의 리프 노드와 다르다.

모든 NIL 포인터가 NIL이라는 리프 노드를 가리킨다고 가정한다.

(5)

5 NIL NIL

NIL NIL

NIL

NIL

NIL NIL

5. 루트 노드에서 모든 잎 노드 사이에 있는 검은색 노드의 수는 모두 동일하다.

3. 잎 노드는 모두 검은색이다.

4. 빨간 노드의 자식들은 모두 검은색이다

2. 1 루트 노드는 검은색이다.

2 리프

3

4

(6)

NIL NIL

NIL NIL NIL

NIL NIL NIL

NIL

(a) BST의 한 예 (b) (a)를 RB Tree로 만든 예

NIL

(c) 실제 구현시의 NIL 노드 처리 방법

BST를 RB Tree로 만든 예

(7)

RB Tree 구현을 위한 자료구조

7

typedef struct tagRBTNode {

struct tagRBTNode* Parent;

struct tagRBTNode* Left;

struct tagRBTNode* Right;

enum { RED, BLACK } Color;

ElementType Data;

} RBTNode;

(8)

RB Tree에서의 삽입

• BST에서의 삽입과 같다. 다만 삽입 후 삽입된 노드를 레드로 칠 한다. (이 노드를

x

라 하자)

• 만일

x

의 부모 노드

p

의 색상이

– 블랙이면 아무 문제 없다.

– 레드이면 레드블랙특성 ③이 깨진다.

x

p

x

p

 그러므로 p가 레드인 경우만 고려하면 된다

(9)

RB Tree에서의 삽입

?

x

p s

p2

주어진 조건:

p

is red

p2

x

의 형제 노드는 반드시 블랙이다

s

의 색상에 따라 두 가지로 나눈다

– Case 1: s가 레드

– Case 2: s가 블랙

(10)

x

p s

x

p s

Case 1 p2 p2

Case 1: s가

레드

: 색상이 바뀐 노드

p2

에서 방금과 같은 문제가 발생할 수 있다: recursive problem!

(11)

y

p

s p2

x

x

p

1

s p2

y

2

2 1

Case 2-1 Case 2-2로!

Case 2-1: s가 블랙이고, x가 p의 오른쪽 자식

(12)

x

p s x

p

s p2

p2

y y

Case 2-2

Case 2-2: s가 블랙이고, x가 p의 왼쪽 자식

: 색상이 바뀐 노드

삽입 완료!

(13)

노드의 회전

우회전을 할 때에는 왼쪽 자식 노드의 오른쪽 자식 노드를 부모 노드의 왼쪽 자식으로 연결한다. 

좌회전을 할 때에는 오른쪽 자식 노드의 왼쪽 자식 노드를 부모 노드의 오른쪽 자식으로 연결한다. 

13

(14)

5, 4, 3, 2, 1 의 순서대로 키가 입력될 경우: Binary Search Tree

5 4

3 2

1

(15)

15

5, 4, 3, 2, 1 의 순서대로 키가 입력될 경우: Red-Black Tree

5

NIL NIL

5

NIL

4 NIL NIL

5

NIL

4 NIL 3 NIL

NIL 5

NIL NIL

4

NIL 3

NIL

(16)

NIL 2

NIL

5

NIL 4

NIL 3

NIL

NIL 2

NIL

5

NIL 4

NIL 3

NIL

(17)

17

2

NIL

5

NIL 4

3 NIL

NIL NIL

1

NIL 2

NIL

5

NIL 4

NIL 3

NIL

NIL 1

NIL

(18)

RB Tree에서의 삭제

교재 참고

(19)

B‐Trees

디스크의 접근 단위는 블록(페이지)

디스크에 한 번 접근하는 시간은 수십만 명령어의 처리 시 간과 맞먹는다.

검색트리가 디스크에 저장되어 있다면 트리의 높이를 최 소화하는 것이 유리하다.

B‐트리는 다진검색트리가 균형을 유지하도록 하여 최악의 경우 디스크 접근 횟수를 줄인 것이다.

(20)

T0

key0 key1 key2

keyk-1

T1 T2 T3

Tk

Ti

keyi-1 < < keyi

다진검색트리

(21)

B-Tree

 B-Tree는 균형잡힌 다진검색트리로 다음의 성질을 만족한다

– 루트를 제외한 모든 노드는 k/2 ~ k 개의 키를 갖는다 – 모든 리프 노드는 같은 깊이를 가진다

1 2 3 4 6 8 10 15 17 19 20 7 13 25 34

37 38 40 41 45 27 28 30 33

k=5

(22)

<key

0

, p

0

> <key

1

, p

1

>

<key

k-1

, p

k-

1

>

부모 노드의 페이지

B-트리의 노드 구조

(23)

<key

0

, p

0

> … <key

i

, p

i

> …

페이지 pi

keyi를 가진 record

B-트리를 통해 Record에 접근하는 과정

(24)

B‐트리에서의 삽입

① x를 삽입할 리프 노드 r을 찾는다.

② 노드 r에 공간의 여유가 있으면 키를 삽입하고 끝낸다.

③ 노드 r에 여유가 없으면 형제 노드를 살펴 공간의 여유 가 있으면 형제 노드에 키를 하나 넘기고 끝낸다.

④ 형제 노드에 여유가 없으면 노드를 두 개로 분리한다.

분리 작업은 부모 노드에서의 삽입 작업을 포함한다.

(25)

1 2 3 4 6 8 10 15 17 19 20 7 13 25 34

(a)

37 38 40 41 45 27 28 30 33

1 2 3 4 6 8 9 10 15 17 19 20 7 13 25 34

(b)

37 38 40 41 45 27 28 30 31 33

9, 31 삽입

5 삽입

B-Tree에서 삽입의 예

※ 각 노드는 최대 5개, 최소 2개의 key를 가짐

(26)

1 2 3 4 5 6 8 9 10 15 17 19 20 7 13 25 34

(c)

37 38 40 41 45 27 28 30 31 33

오버플로우!

1 2 3 4 5 7 8 9 10 15 17 19 20 6 13 25 34

37 38 40 41 45 27 28 30 31 33

39 삽입

(27)

1 2 3 4 5 7 8 9 10 15 17 19 20 6 13 25 34

37 38 39 40 41 45 27 28 30 31 33

오버플로우!

39 삽입

(d)

1 2 3 4 5 7 8 9 10 15 17 19 20

6 13 25 34 40

37 38 39

27 28 30 31 33 41 45 23, 35, 36 삽입 분할!

(28)

23, 35, 36 삽입

1 2 3 4 5 7 8 9 10 15 17 19 20 23

6 13 25 34 40

35 36 37 38 39

27 28 30 31 33 41 45 32 삽입

(e)

(29)

1 2 3 4 5 7 8 9 10 15 17 19 20 23

6 13 25 31 34 40

35 36 37 38 39

27 28 30 32 33 41 45

오버플로우!

1 2 3 4 5 7 8 9 10 15 17 19 20 23 6 13 25

35 36 37 38 39

27 28 30 32 33 41 45

분할!

34 40 31

32 삽입

1 2 3 4 5 7 8 9 10 15 17 19 20 23 35 36 37 38 39 41 45

오버플로우!

(f)

6 13 25 34 40

27 28 30 31 32 33

분할!

(30)

B-Tree에서의 삽입

BTreeInsert(t, x)

{ x를 삽입할 리프 노드 r을 찾는다;

xr에 삽입한다;

if (r에 오버플로우 발생) then clearOverflow(r);

} clearOverflow(r)

{ if (r의 형제 노드 중 여유가 있는 노드가 있음) then {r의 남는 키를 넘긴다};

else {

r을 둘로 분할하고 가운데 키를 부모 노드로 넘긴다;

if (부모 노드 p에 오버플로우 발생) then clearOverflow(p);

} }

t : 트리의 루트 노드

x : 삽입하고자 하는 키

(31)

B‐트리에서의 삭제

① x를 키로 갖고 있는 노드를 찾는다.

② 이 노드가 리프 노드가 아니면 x의 직후원소 y를 가진 리프 노드 r을 찾아 x와 y를 맞바꾼다.

③ 리프 노드에서 x를 제거한다.

④ x 제거 후 노드에 언더플로우가 생기면 적절히 해소한다.

31

(32)

15

1 2 3 5 6 7 9 10 16 18 20 21 24 25 26 19 22

4 8

7 삭제

(a)

(b)

15

1 2 3 5 6 9 10 16 18 20 21 24 25 26 19 22

4 8

4 삭제

B-Tree에서 삭제의 예

(33)

15

1 2 3 6 9 10 16 18 20 21 24 25 26 19 22

5 8

언더플로우!

15

1 2 5 6 9 10 16 18 20 21 24 25 26 19 22

3 8

9 삭제

(c)

15

1 2 3 4 6 9 10 16 18 20 21 24 25 26 19 22

5 8

4 제거 4, 5 교환

재분배

(34)

15

1 2 5 6 10 16 18 20 21 24 25 26 19 22

3 8

(d)

언더플로우!

15

1 2 5 6 8 10 16 18 20 21 24 25 26 19 22

3

언더플로우!

병합!

1 2 5 6 8 10 16 18 20 21 24 25 26 3 15 19 22

병합!

(35)

B-Tree에서의 삭제

BTreeDelete(t, x, v) {

if(v가 리프 노드 아님) then {

x의 직후원소 y를 가진 리프 노드를 찾는다;

x와 y를 맞바꾼다;

} 리프 노드에서 x를 제거하고 이 리프 노드를 r이라 한다;

if(r에서 언더플로우 발생) then clearUnderflow(r);

}

clearUnderflow(r) {

if( r의 형제 노드 중 키를 하나 내놓을 수 있는 여분을 가진 노드가 있음) then { r이 키를 넘겨받는다;}

else {

r의 형제 노드와 r을 합병한다;

if(부모 노드 p에 언더플로우 발생) then clearUnderflow(p);

} }

t : 트리의 루트 노드

x : 삭제하고자 하는 키

v : x를 갖고 있는 노드

(36)

Question & 

Answer

참조

관련 문서

② 삽입할 원소 item과 부모노드 heap[i/2]를 비교하여 item이 부모노드 보다 작거나 같으면 현재의 삽입 위치 i를 삽입 원소의 위치로 확정한다.. ④ 마지막 노드의

[r]

어반 브라운/바닐라 베이지 투톤(바닐라 베이지 시트) 천연 가죽 시트(테크니컬 펀칭, 파이핑 적용) 옵시디언 블랙 모노톤(옵시디언 블랙 시트) 프라임

만약 다른 노드에서 같은 시간에 버스로 프레임을 전송하면, 이 두 프레임간에 충돌이 발생하고 케이블에 연결된 노드들은 충돌 을 감지하면 즉시 전송을 중단한다.

⑤ 찾은 위치에 삽입할 노드 item을 저장하면, 최대 히프의 재구성 작업이 완성되므로 삽입 연산을 종료한다... • 삭제된 n번 노드에

• 오른쪽 서브 트리의 키들은 루트의 키보다 크다.. • 왼쪽과 오른쪽 서브 트리도

이러한 갂선을

트리(일반 트리) 중에서 자식 노드의 수가 2개 이하인 것을 이진 트리(binary tree)라고 한다.. 일반 트리는 앞에서 보았듯이 컴퓨터에