검색 트리Search Trees
Dynamic Set    • 여러 개의 키를 저장    • 다음과 같은 연산들을 지원하는 자료구조         • INSERT - 새로운 키의 삽입         • SEARCH - 키 탐색         • DEL...
다양한 방법들       • 정렬된 혹은 정렬되지 않은 배열 혹은 연결 리스트를         사용할 경우 INSERT, SEARCH, DELETE 중 적어도         하나는 O(n).       • 이진탐색트리(...
탐색 트리       • Dynamic set을 트리의 형태로 구현       • 일반적으로 SEARCH, INSERT, DELETE연산이 트리의         높이(height)에 비례하는 시간복잡도를 가짐      ...
이진검색트리 (BST)    • 이진 트리이면서    • 각 노드에 하나의 키를 저장    • 각 노드 v에 대해서 그 노드의 왼쪽 부트리(subtree)에 있는      키들은 key[v]보다 작거나 같고, 오른쪽 부...
이진검색트리 (BST)                BST의 예Spring 2012       Algorithms   6
이진검색트리의 표현    • 연결구조(Linked Structure) 표현                            left        key      p      right                    ...
BST의 Inorder-순회                   r                                         이진트리를 루트노드 r, 왼쪽                              ...
BST의 Inorder-순회      2, 3, 5, 5, 7, 8순으로 순회                                         2, 3, 5, 5, 7, 8              BST의 Ino...
BST의 Inorder-순회              시간복잡도 O(n)Spring 2012        Algorithms   10
Postorder와 Preorder순회    PREORDER-TREE-WALK(x)              if x ≠ NIL              then print key[x]                     ...
SEARCH              키 13을 검색: 15 → 6 → 7 → 13Spring 2012             Algorithms        12
SEARCH              시간복잡도: O(h), 여기서 h는 트리의 높이Spring 2012              Algorithms        13
SEARCH - Iterative Version              시간복잡도: O(h), 여기서 h는 트리의 높이Spring 2012                 Algorithms         14
최소값              최소값은 항상 가장 왼쪽 노드에 존재                   시간복잡도: O(h)Spring 2012           Algorithms     15
최대값              최대값은 항상 가장 오른쪽 노드에 존재                   시간복잡도: O(h)Spring 2012            Algorithms     16
Successor    • 노드 x의 successor란 key[x]보다 크면서 가장 작은 키를      가진 노드    • 모든 키들이 서로 다르다고 가정                               15  ...
Successor    • 3가지 경우         • 노드 x의 오른쪽 부트리가 존재할 경우, 오른쪽 부트리의           최소값.         • 오른쪽 부트리가 없는 경우, 어떤 노드 y의 왼쪽 부트리의 ...
Successor              시간복잡도: O(h)Spring 2012       Algorithms   19
Predecessor    • 노드 x의 predecessor란 key[x]보다 작으면서 가장 큰 키를      가진 노드    • Successor와 반대Spring 2012              Algorithms...
INSERT                                         15               14를 insert                          6                     ...
INSERT30                         30                     30                       30           20                          ...
INSERT              시간복잡도: O(h)Spring 2012      Algorithms   23
INSERT: Recursive Version     treeInsert(t, x)                                                          t : 트리의 루트 노드     ...
DELETE    • Case 1: 자식노드가 없는 경우                                     15                          6                         ...
삭제의 예: Case 1                      55                                           55        15                        60    ...
DELETE    • Case 2: 자식노드가 1개인 경우                               15                      6                              18  ...
삭제의 예: Case 2                  55                                              55                                         ...
DELETE    • Case 3: 자식노드가 2개인 경우                                     13                                                   ...
DELETE    • Case 3: 자식노드가 2개인 경우        1. successor의 값을                                     15                           ...
삭제의 예: Case 3                      55                                              55        15                       60  ...
55                                            55        15                    60                       15                 ...
시간복잡도: O(h)Spring 2012   Algorithms             33
Spring 2012   Algorithms   34
BST    • 각종 연산의 시간복잡도 O(h)    • 그러나, 최악의 경우 트리의 높이 h=O(n)    • 균형잡힌(balanced) 트리         • 레드-블랙 트리 등         • 키의 삽입이나 삭제...
레드-블랙 트리    • 이진탐색트리의 일종    • 균형잡힌 트리: 높이가 O(log2n)    • SEARCH, INSERT, DELETE 연산을 최악의 경우에도      O(log2n) 시간에 지원Spring 20...
레드-블랙 트리    • 각 노드는 하나의 키(key), 왼쪽자식(left), 오른쪽 자식(right),      그리고 부모노드(p)의 주소를 저장    • 자식노드가 존재하지 않을 경우 NIL 노드라고 부르는 특수한...
레드-블랙 트리Spring 2012     Algorithms   38
레드-블랙 트리: 정의    • 다음의 조건을 만족하는이진탐색트리:    1. 각 노드는 red 혹은 black이고,    2. 루트노드는 black이고,    3. 모든 리프노드(즉, NIL노드)는 블랙이고,    4...
레드-블랙 트리: 예                                                        h=4                                                    ...
레드-블랙 트리의 높이    • 노드 x의 높이 h(x)는 자신으로부터 리프노드까지의 가장 긴      경로에 포함된 에지의 개수이다.    • 노드 x의 블랙-높이 bh(x)는 x로부터 리프노드까지의      경로상의...
레드-블랙 트리의 높이    • 높이가 h인 노드의 블랙-높이는 bh≥h/2 이다.         • 조건4에 의해 레드노드는 연속될수 없으므로 당연    • 노드 x를 루트로하는 임의의 부트리는 적어도 2bh(x)-1...
Left and Right Rotation    • 시간복잡도 O(1)    • 이진탐색트리의 특성을 유지Spring 2012           Algorithms        43
Left Rotation    • y = right[x] ≠NIL이라고 가정    • 루트노드의 부모도 NIL이라고 가정Spring 2012             Algorithms   44
Left RotationSpring 2012      Algorithms   45
INSERT                           • 보통의 BST에서처럼                             노드를 INSERT한다.                           • 새로운 노...
RB-INSERT-FIXUP    • 위반될 가능성이 있는 조건들         1. OK.         2. 만약 z가 루트노드라면 위반, 아니라면 OK.         3. OK.         4. z의 부모 p...
RB-INSERT-FIXUP    • Loop Invariant:         • z는 red노드         • 오직 하나의 위반만이 존재한다:              • 조건2: z가 루트노드이면서 red이거나,...
왜 z의        경우1: z의 삼촌이 red      할아버지가       반드시      존재할까?              조건 2와 4 이외의 조건들은 여전히 OK면서                     z가 ...
경우2와 3: z의 삼촌이 black    • 경우2: z가 오른쪽 자식인 경우         • p[z]에 대해서 left-rotation한 후 원재 p[z]를 z로         • 경우3으로    • 경우3: z가...
경우 4,5,6    • 경우 1,2,3은 p[z]가 p[p[z]]의 왼쪽자식인 경우들    • 경우 4,5,6은 p[z]가 p[p[z]]의 오른쪽 자식인 경우         • 경우 1,2,3과 대칭적이므로 생략Spr...
Spring 2012   Algorithms   52
INSERT의 시간복잡도    • BST에서의 INSERT: O(log2n)    • RB-INSERT-FIXUP         • 경우1에 해당할 경우 z가 2레벨 상승         • 경우 2,3에 해당할 경우 O...
Spring 2012   Algorithms   54
DELETE                           • 보통의 BST에서처럼                             DELETE한다.                           • 실제로 삭제된 노...
RB-DELETE-FIXUP(T,x)    1. OK.    2. y가 루트였고 x가 red인 경우 위반    3. OK.    4. p[y]와 x가 모두 red일 경우 위반    5. 원래 y를 포함했던 모든 경로는 ...
RB-DELETE-FIXUP(T,x)    • 아이디어:         • extra black을 트리의 위쪽으로 올려보냄         • x가 red&black상태가 되면 그냥 black노드로 만들고 끝냄      ...
black    경우1: w가 red인 경우doubl  eblack                  black                          ≠ NIL node (조건5)    • w의 자식들은 black ...
경우2: w는 black, w의 자식들도 black                                             gray노드는                                          ...
경우3: w는 black, w의 왼쪽자식이 red    • w를 red로, w의 왼자식을 black으로    • w에 대해서 right-rotation적용    • x의 새로운 형제 w는 오른자식이 red: 경우4에 해...
경우4: w는 black, w의 오른쪽자식이 red    • w의 색을 현재 p[x]의 색으로 (unknown color)    • p[x]를 black으로, w의 오른자식을 black으로    • p[x]에 대해서 l...
경우 5,6,7,8    • 경우 1,2,3,4는 x가 왼쪽 자식인 경우    • 경우 5,6,7,8은 x가 p[x]의 오른쪽 자식인 경우         • 경우 1,2,3,4와 각각 대칭적임Spring 2012    ...
Spring 2012   Algorithms   63
Spring 2012   Algorithms   64
시간복잡도    • BST에서의 DELETE: O(log2n)    • RB-DELETE-FIXUP: O(log2n)Spring 2012               Algorithms   65
B-Trees    • 디스크의 접근 단위는 블록(페이지)    • 디스크에 한 번 접근하는 시간은 수십만 명령어의 처리      시간과 맞먹는다.    • 검색트리가 디스크에 저장되어 있다면 트리의 높이를      최...
다진검색트리              key0        key1        key2              …    keyk-1       T0            T1          T2              ...
B-Tree       B-Tree는 균형잡힌 다진검색트리로 다음의 성질을 만족한다             루트를 제외한 모든 노드는 k/2 ~ k 개의 키를 갖는다. 이때 k를 B-              트리의 차...
B-트리의 노드 구조                 부모 노드의 페이지              <key0, p0>   <key1, p1>                …       <keyk-1, pk-           ...
B-트리를 통해 Record에 접근하는 과정              <key0, p0>   …      <keyi, pi>   …                           키 keyi를 가진 record      ...
B-Tree에서의 삽입 BTreeInsert(t, x)                           ▷ t : 트리의 루트 노드 {                                           ▷ x :...
B-Tree에서 삽입의 예  (a)                           7 13 25 34        1 2 3 4 6    8 10    15 17 19 20         27 28 30 33     3...
(c)                      7 13 25 34   1 2 3 4 5 6    8 9 10    15 17 19 20      27 28 30 31 33   37 38 40 41 45   오버플로우!  ...
39 삽입     (d)                              6 13 25 34  1 2 3 4 5    7 8 9 10    15 17 19 20        27 28 30 31 33   37 38 ...
23, 35, 36 삽입      (e)                                   6 13 25 34 401 2 3 4 5       7 8 9 10   15 17 19 20 23   27 28 30...
32 삽입        (f)                                       6 13 25 34 401 2 3 4 5        7 8 9 10     15 17 19 20 23 27 28 30 ...
B-Tree에서의 삭제 BTreeDelete(t, x, v)                            ▷ t : 트리의 루트 노드 {                                            ...
B-Tree에서 삭제의 예       (a)                        15                  4 8                                19 22        1 2 3 ...
15       (c)          4, 5 교환                           5 8                                   19 22         1 2 3         ...
(d)                                     15                           3 8                                       19 22      ...
Upcoming SlideShare
Loading in …5
×

Part4 search trees

1,290 views

Published on

search tree

Published in: Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,290
On SlideShare
0
From Embeds
0
Number of Embeds
28
Actions
Shares
0
Downloads
12
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Part4 search trees

  1. 1. 검색 트리Search Trees
  2. 2. Dynamic Set • 여러 개의 키를 저장 • 다음과 같은 연산들을 지원하는 자료구조 • INSERT - 새로운 키의 삽입 • SEARCH - 키 탐색 • DELETE - 키의 삭제 • 예: 심볼 테이블 called Dynamic Set, Dictionary, or Search StructureSpring 2012 Algorithms 2
  3. 3. 다양한 방법들 • 정렬된 혹은 정렬되지 않은 배열 혹은 연결 리스트를 사용할 경우 INSERT, SEARCH, DELETE 중 적어도 하나는 O(n). • 이진탐색트리(Binary Search Tree), 레드-블랙 트리, AVL-트리 등의 트리에 기반한 구조들 • Direct Address Table, 해쉬 테이블 등Spring 2012 Algorithms 3
  4. 4. 탐색 트리 • Dynamic set을 트리의 형태로 구현 • 일반적으로 SEARCH, INSERT, DELETE연산이 트리의 높이(height)에 비례하는 시간복잡도를 가짐 • 이진검색트리(Binary Search Tree), 레드-블랙 트리(red- black tree), B-트리 등Spring 2012 Algorithms 4
  5. 5. 이진검색트리 (BST) • 이진 트리이면서 • 각 노드에 하나의 키를 저장 • 각 노드 v에 대해서 그 노드의 왼쪽 부트리(subtree)에 있는 키들은 key[v]보다 작거나 같고, 오른쪽 부트리에 있는 값은 크거나 같다.Spring 2012 Algorithms 5
  6. 6. 이진검색트리 (BST) BST의 예Spring 2012 Algorithms 6
  7. 7. 이진검색트리의 표현 • 연결구조(Linked Structure) 표현 left key p right node left key p right left key p right 각 노드는 하나의 키(key)와 왼쪽자식(left), 오른쪽 자식(right), 그리고 부모노드(p)의 주소를 저장Spring 2012 Algorithms 7
  8. 8. BST의 Inorder-순회 r 이진트리를 루트노드 r, 왼쪽 부트리 TL, 오른쪽 부트리 TR로 나누어 생각 TR TL 1. 먼저 TL을 inorder로 순회하고, 2. r을 순회하고, 3. TR을 inorder로 순회.Spring 2012 Algorithms 8
  9. 9. BST의 Inorder-순회 2, 3, 5, 5, 7, 8순으로 순회 2, 3, 5, 5, 7, 8 BST의 Inorder순회는 key값들을 크기순으로 정렬Spring 2012 Algorithms 9
  10. 10. BST의 Inorder-순회 시간복잡도 O(n)Spring 2012 Algorithms 10
  11. 11. Postorder와 Preorder순회 PREORDER-TREE-WALK(x) if x ≠ NIL then print key[x] PRE-ORDER-TREE-WALK(left[x]) PRE-ORDER-TREE-WALK(right[x]). POSTORDER-TREE-WALK(x) if x ≠ NIL then POST-ORDER-TREE-WALK(left[x]) POST-ORDER-TREE-WALK(right[x]). print key[x]Spring 2012 Algorithms 11
  12. 12. SEARCH 키 13을 검색: 15 → 6 → 7 → 13Spring 2012 Algorithms 12
  13. 13. SEARCH 시간복잡도: O(h), 여기서 h는 트리의 높이Spring 2012 Algorithms 13
  14. 14. SEARCH - Iterative Version 시간복잡도: O(h), 여기서 h는 트리의 높이Spring 2012 Algorithms 14
  15. 15. 최소값 최소값은 항상 가장 왼쪽 노드에 존재 시간복잡도: O(h)Spring 2012 Algorithms 15
  16. 16. 최대값 최대값은 항상 가장 오른쪽 노드에 존재 시간복잡도: O(h)Spring 2012 Algorithms 16
  17. 17. Successor • 노드 x의 successor란 key[x]보다 크면서 가장 작은 키를 가진 노드 • 모든 키들이 서로 다르다고 가정 15 6 18 3 7 17 20 2 4 13 15의 successor는 17 6의 successor는 7 9 4의 successor는 6Spring 2012 Algorithms 17
  18. 18. Successor • 3가지 경우 • 노드 x의 오른쪽 부트리가 존재할 경우, 오른쪽 부트리의 최소값. • 오른쪽 부트리가 없는 경우, 어떤 노드 y의 왼쪽 부트리의 최대값이 x가 되는 그런 노드 y가 x의 successor • 부모를 따라 루트까지 올라가면서 처음으로 누군가의 왼쪽 자식이 되는 노드 • 그런 노드 y가 존재하지 않을 경우 successor가 존재하지 않음 (즉, x가 최대값)Spring 2012 Algorithms 18
  19. 19. Successor 시간복잡도: O(h)Spring 2012 Algorithms 19
  20. 20. Predecessor • 노드 x의 predecessor란 key[x]보다 작으면서 가장 큰 키를 가진 노드 • Successor와 반대Spring 2012 Algorithms 20
  21. 21. INSERT 15 14를 insert 6 18 3 7 17 20 y 2 4 13 x=NIL 9 14 2개의 포인터 x, y를 사용Spring 2012 Algorithms 21
  22. 22. INSERT30 30 30 30 20 20 20 40 25 25(a) (b) (c) (d) 30 30 20 40 20 4010 25 10 25 35 (e) (f)
  23. 23. INSERT 시간복잡도: O(h)Spring 2012 Algorithms 23
  24. 24. INSERT: Recursive Version treeInsert(t, x) t : 트리의 루트 노드 { x : 삽입하고자 하는 키 if (t=NIL) then { key[r] ← x; ▷ r : 새 노드 return r; } if (x < key(t)) then {left[t] ← treeInsert(left[t], x); return t;} else {right[t] ← treeInsert(right[t], x); return t;} }Spring 2012 Algorithms 24
  25. 25. DELETE • Case 1: 자식노드가 없는 경우 15 6 18 3 7 17 20 2 4 13 9 4를 삭제하는 경우: 그냥 삭제Spring 2012 Algorithms 25
  26. 26. 삭제의 예: Case 1 55 55 15 60 15 60 8 28 90 8 28 90 r3 18 30 3 30 48 48 38 50 38 50 33 33 32 36 32 36 (a) r의 자식이 없음 (b) 단순히 r을 제거한다
  27. 27. DELETE • Case 2: 자식노드가 1개인 경우 15 6 18 3 7 17 20 2 4 13 9 7을 삭제하는 경우: 자신의 자식노드를 원래 자신의 위치로Spring 2012 Algorithms 27
  28. 28. 삭제의 예: Case 2 55 55 55 15 60 15 60 15 60 8 28 90 8 28 90 8 28 90 r3 18 30 3 18 3 18 48 48 48 38 50 38 50 38 50 33 33 33 32 36 32 36 32 36 (a) r의 자식이 하나뿐임 (b) r을 제거 (c) r 자리에 r의 자식을 놓는다
  29. 29. DELETE • Case 3: 자식노드가 2개인 경우 13 13을 삭제하는 경우 6 18 3 7 17 20 2 4 15 삭제하려는 노드의 successor 16 삭제하려는 노드의 successor는 최대 1개의 자식노드를 가짐Spring 2012 Algorithms 29
  30. 30. DELETE • Case 3: 자식노드가 2개인 경우 1. successor의 값을 15 13을 삭제하는 경우 삭제하려는 노드로 copy한다. 6 18 3 7 17 20 2 4 15 2. Successor 노드를 대신 삭제한다 (Case 1 or 2에 해당) 16Spring 2012 Algorithms 30
  31. 31. 삭제의 예: Case 3 55 55 15 60 15 60 r 8 28 90 8 903 18 45 3 18 45 41 48 41 48 s s 30 50 30 50 38 38 33 33 32 36 32 36 (a) r의 직후원소 s를 찾는다 (b) r을 없앤다
  32. 32. 55 55 15 60 15 60 s s 8 30 90 8 30 903 18 45 3 18 45 41 48 41 48 50 38 50 38 33 33 32 36 32 36 (c) s를 r자리로 옮긴다 (d) s가 있던 자리에 s의 자식을 놓는다
  33. 33. 시간복잡도: O(h)Spring 2012 Algorithms 33
  34. 34. Spring 2012 Algorithms 34
  35. 35. BST • 각종 연산의 시간복잡도 O(h) • 그러나, 최악의 경우 트리의 높이 h=O(n) • 균형잡힌(balanced) 트리 • 레드-블랙 트리 등 • 키의 삽입이나 삭제시 추가로 트리의 균형을 잡아줌으로써 높이를 O(log2n)으로 유지Spring 2012 Algorithms 35
  36. 36. 레드-블랙 트리 • 이진탐색트리의 일종 • 균형잡힌 트리: 높이가 O(log2n) • SEARCH, INSERT, DELETE 연산을 최악의 경우에도 O(log2n) 시간에 지원Spring 2012 Algorithms 36
  37. 37. 레드-블랙 트리 • 각 노드는 하나의 키(key), 왼쪽자식(left), 오른쪽 자식(right), 그리고 부모노드(p)의 주소를 저장 • 자식노드가 존재하지 않을 경우 NIL 노드라고 부르는 특수한 노드가 있다고 가정 • 따라서 모든 리프노드는 NIL노드 • 루트의 부모도 NIL노드라고 가정 • 노드들은 내부노드와 NIL노드로 분류Spring 2012 Algorithms 37
  38. 38. 레드-블랙 트리Spring 2012 Algorithms 38
  39. 39. 레드-블랙 트리: 정의 • 다음의 조건을 만족하는이진탐색트리: 1. 각 노드는 red 혹은 black이고, 2. 루트노드는 black이고, 3. 모든 리프노드(즉, NIL노드)는 블랙이고, 4. 레드노드의 자식노드들은 전부 블랙이고(즉, 레드노드는 연속되어 등장하지 않고), 5. 모든 노드에 대해서 그 노드로부터 자손인 리프노드에 이르는 모든 경로에는 동일한 개수의 블랙노드가 존재한다.Spring 2012 Algorithms 39
  40. 40. 레드-블랙 트리: 예 h=4 bh=2 15 h=3 bh=2 h=1 18 bh=1 6 h=2 h=2 bh=1 7 bh=1 3 h=1 h=1 bh=1 bh=1 4 13 NILSpring 2012 Algorithms 40
  41. 41. 레드-블랙 트리의 높이 • 노드 x의 높이 h(x)는 자신으로부터 리프노드까지의 가장 긴 경로에 포함된 에지의 개수이다. • 노드 x의 블랙-높이 bh(x)는 x로부터 리프노드까지의 경로상의 블랙노드의 개수이다 (노드 x 자신은 불포함)Spring 2012 Algorithms 41
  42. 42. 레드-블랙 트리의 높이 • 높이가 h인 노드의 블랙-높이는 bh≥h/2 이다. • 조건4에 의해 레드노드는 연속될수 없으므로 당연 • 노드 x를 루트로하는 임의의 부트리는 적어도 2bh(x)-1개의 내부노드를 포함한다(수학적귀납법) • n개의 내부노드를 가지는 레드블랙트리의 높이는 2log2(n+1)이하이다. • n≥2bh-1≥2h/2-1 이므로Spring 2012 Algorithms 42
  43. 43. Left and Right Rotation • 시간복잡도 O(1) • 이진탐색트리의 특성을 유지Spring 2012 Algorithms 43
  44. 44. Left Rotation • y = right[x] ≠NIL이라고 가정 • 루트노드의 부모도 NIL이라고 가정Spring 2012 Algorithms 44
  45. 45. Left RotationSpring 2012 Algorithms 45
  46. 46. INSERT • 보통의 BST에서처럼 노드를 INSERT한다. • 새로운 노드 z를 red노드로 한다. • RB-INSERT-FIXUP을 호출한다.Spring 2012 Algorithms 46
  47. 47. RB-INSERT-FIXUP • 위반될 가능성이 있는 조건들 1. OK. 2. 만약 z가 루트노드라면 위반, 아니라면 OK. 3. OK. 4. z의 부모 p[z]가 red이면 위반. 5. OK.Spring 2012 Algorithms 47
  48. 48. RB-INSERT-FIXUP • Loop Invariant: • z는 red노드 • 오직 하나의 위반만이 존재한다: • 조건2: z가 루트노드이면서 red이거나, 또는 • 조건4: z와 그 부모 p[z]가 둘 다 red이거나. • 종료조건: • 부모노드 p[z]가 black이되면 종료한다. 만약 종료 후 조건2가 위반일 경우 z를 블랙으로 바꿔주면 해결된다.Spring 2012 Algorithms 48
  49. 49. 왜 z의 경우1: z의 삼촌이 red 할아버지가 반드시 존재할까? 조건 2와 4 이외의 조건들은 여전히 OK면서 z가 두칸 위로 올라감Spring 2012 Algorithms 49
  50. 50. 경우2와 3: z의 삼촌이 black • 경우2: z가 오른쪽 자식인 경우 • p[z]에 대해서 left-rotation한 후 원재 p[z]를 z로 • 경우3으로 • 경우3: z가 왼쪽 자식인 경우 • p[z]를 black, p[p[z]]를 red로 바꿈 • p[p[z]]에 대해서 right-rotationSpring 2012 Algorithms 50
  51. 51. 경우 4,5,6 • 경우 1,2,3은 p[z]가 p[p[z]]의 왼쪽자식인 경우들 • 경우 4,5,6은 p[z]가 p[p[z]]의 오른쪽 자식인 경우 • 경우 1,2,3과 대칭적이므로 생략Spring 2012 Algorithms 51
  52. 52. Spring 2012 Algorithms 52
  53. 53. INSERT의 시간복잡도 • BST에서의 INSERT: O(log2n) • RB-INSERT-FIXUP • 경우1에 해당할 경우 z가 2레벨 상승 • 경우 2,3에 해당할 경우 O(1) • 따라서 트리의 높이에 비례하는 시간 • 즉, INSERT의 시간복잡도는 O(log2n)Spring 2012 Algorithms 53
  54. 54. Spring 2012 Algorithms 54
  55. 55. DELETE • 보통의 BST에서처럼 DELETE한다. • 실제로 삭제된 노드 y가 red였으면 종료. • y가 black이었을 경우RB- DELETE-FIXUP을 호출한다. 여기서 x는 y가 자식이 있었을 경우 그 자식노드, 없었을 경우 NIL노드. 두 경우 모두 p[x]는 원래 p[y]였던 노드Spring 2012 Algorithms 55
  56. 56. RB-DELETE-FIXUP(T,x) 1. OK. 2. y가 루트였고 x가 red인 경우 위반 3. OK. 4. p[y]와 x가 모두 red일 경우 위반 5. 원래 y를 포함했던 모든 경로는 이제 black노드가 하나 부족 • 노드 x에 “extra black”을 부여해서 일단 조건5를 만족 • 노드 x는 “double black” 혹은 “red & black”Spring 2012 Algorithms 56
  57. 57. RB-DELETE-FIXUP(T,x) • 아이디어: • extra black을 트리의 위쪽으로 올려보냄 • x가 red&black상태가 되면 그냥 black노드로 만들고 끝냄 • x가 루트가 되면 그냥 extra black을 제거 • Loop Invariant • x는 루트가 아닌 double-black노드 • w는 x의 형제노드 • w는 NIL 노드가 될수 없음 (아니면 x의 부모에 대해 조건5가 위반)Spring 2012 Algorithms 57
  58. 58. black 경우1: w가 red인 경우doubl eblack black ≠ NIL node (조건5) • w의 자식들은 black • w를 black으로, p[x]를 red로 • p[x]에 대해서 left-rotation적용 • x의 새로운 형제노드는 원래 w의 자식노드, 따라서 black노드 • 경우 2,3,혹은 4에 해당Spring 2012 Algorithms 58
  59. 59. 경우2: w는 black, w의 자식들도 black gray노드는 unknown color • x의 extra-black을 뺏고, w를 red로 바꿈. • p[x]에게 뺏은 extra-black을 준다. • p[x]를 새로운 x로 해서 계속. • 만약 경우1에서 이 경우에 도달했다면 p[x]는 red였고, 따라서 새로운 x는 red&black이 되어서 종료Spring 2012 Algorithms 59
  60. 60. 경우3: w는 black, w의 왼쪽자식이 red • w를 red로, w의 왼자식을 black으로 • w에 대해서 right-rotation적용 • x의 새로운 형제 w는 오른자식이 red: 경우4에 해당Spring 2012 Algorithms 60
  61. 61. 경우4: w는 black, w의 오른쪽자식이 red • w의 색을 현재 p[x]의 색으로 (unknown color) • p[x]를 black으로, w의 오른자식을 black으로 • p[x]에 대해서 left-rotation적용 • x의 extra-black을 제거하고 종료Spring 2012 Algorithms 61
  62. 62. 경우 5,6,7,8 • 경우 1,2,3,4는 x가 왼쪽 자식인 경우 • 경우 5,6,7,8은 x가 p[x]의 오른쪽 자식인 경우 • 경우 1,2,3,4와 각각 대칭적임Spring 2012 Algorithms 62
  63. 63. Spring 2012 Algorithms 63
  64. 64. Spring 2012 Algorithms 64
  65. 65. 시간복잡도 • BST에서의 DELETE: O(log2n) • RB-DELETE-FIXUP: O(log2n)Spring 2012 Algorithms 65
  66. 66. B-Trees • 디스크의 접근 단위는 블록(페이지) • 디스크에 한 번 접근하는 시간은 수십만 명령어의 처리 시간과 맞먹는다. • 검색트리가 디스크에 저장되어 있다면 트리의 높이를 최소화하는 것이 유리하다. • B-트리는 다진검색트리가 균형을 유지하도록 하여 최악의 경우 디스크 접근 횟수를 줄인 것이다.Spring 2012 Algorithms 66
  67. 67. 다진검색트리 key0 key1 key2 … keyk-1 T0 T1 T2 T3 … Tk keyi-1 < T < keyi iSpring 2012 Algorithms 67
  68. 68. B-Tree  B-Tree는 균형잡힌 다진검색트리로 다음의 성질을 만족한다  루트를 제외한 모든 노드는 k/2 ~ k 개의 키를 갖는다. 이때 k를 B- 트리의 차수(order)라고 부른다.  모든 리프 노드는 같은 깊이를 가진다.Spring 2012 Algorithms 68
  69. 69. B-트리의 노드 구조 부모 노드의 페이지 <key0, p0> <key1, p1> … <keyk-1, pk- 1> …Spring 2012 Algorithms 69
  70. 70. B-트리를 통해 Record에 접근하는 과정 <key0, p0> … <keyi, pi> … 키 keyi를 가진 record 페이지 piSpring 2012 Algorithms 70
  71. 71. B-Tree에서의 삽입 BTreeInsert(t, x) ▷ t : 트리의 루트 노드 { ▷ x : 삽입하고자 하는 키 x를 삽입할 리프 노드 r을 찾는다; x를 r에 삽입한다; if (r에 오버플로우 발생) then clearOverflow(r); } clearOverflow(r) { if (r의 형제 노드 중 여유가 있는 노드가 있음) then {r의 남는 키를 넘긴다}; else { r을 둘로 분할하고 가운데 키를 부모 노드로 넘긴다; if (부모 노드 p에 오버플로우 발생) then clearOverflow(p); } }Spring 2012 Algorithms 71
  72. 72. B-Tree에서 삽입의 예 (a) 7 13 25 34 1 2 3 4 6 8 10 15 17 19 20 27 28 30 33 37 38 40 41 45 9, 31 삽입 (b) 7 13 25 34 1 2 3 4 6 8 9 10 15 17 19 20 27 28 30 31 33 37 38 40 41 45 5 삽입Spring 2012 Algorithms 72
  73. 73. (c) 7 13 25 34 1 2 3 4 5 6 8 9 10 15 17 19 20 27 28 30 31 33 37 38 40 41 45 오버플로우! 6 13 25 34 1 2 3 4 5 7 8 9 10 15 17 19 20 27 28 30 31 33 37 38 40 41 45 39 삽입Spring 2012 Algorithms 73
  74. 74. 39 삽입 (d) 6 13 25 34 1 2 3 4 5 7 8 9 10 15 17 19 20 27 28 30 31 33 37 38 39 40 41 45 오버플로우! 6 13 25 34 401 2 3 4 5 7 8 9 10 15 17 19 20 27 28 30 31 33 37 38 39 41 45 23, 35, 36 삽입 분할!Spring 2012 Algorithms 74
  75. 75. 23, 35, 36 삽입 (e) 6 13 25 34 401 2 3 4 5 7 8 9 10 15 17 19 20 23 27 28 30 31 33 35 36 37 38 39 41 45 32 삽입 Spring 2012 Algorithms 75
  76. 76. 32 삽입 (f) 6 13 25 34 401 2 3 4 5 7 8 9 10 15 17 19 20 23 27 28 30 31 32 33 35 36 37 38 39 41 45 오버플로우! 오버플로우! 6 13 25 31 34 401 2 3 4 5 7 8 9 10 15 17 19 20 23 27 28 30 32 33 35 36 37 38 39 41 45 분할! 31 분할! 6 13 25 34 401 2 3 4 5 7 8 9 10 15 17 19 20 23 27 28 30 32 33 35 36 37 38 39 41 45 Spring 2012 Algorithms 76
  77. 77. B-Tree에서의 삭제 BTreeDelete(t, x, v) ▷ t : 트리의 루트 노드 { ▷ x : 삭제하고자 하는 키 if (v가 리프 노드 아님) then { ▷ v : x를 갖고 있는 노드 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); } }Spring 2012 Algorithms 77
  78. 78. B-Tree에서 삭제의 예 (a) 15 4 8 19 22 1 2 3 5 6 7 9 10 16 18 20 21 24 25 26 7 삭제 (b) 15 4 8 19 22 1 2 3 5 6 9 10 16 18 20 21 24 25 26 4 삭제Spring 2012 Algorithms 78
  79. 79. 15 (c) 4, 5 교환 5 8 19 22 1 2 3 4 6 9 10 16 18 20 21 24 25 26 15 4 제거 5 8 19 22 1 2 3 6 9 10 16 18 20 21 24 25 26 언더플로우! 15 재분배 3 8 19 22 1 2 5 6 9 10 16 18 20 21 24 25 26 9 삭제Spring 2012 Algorithms 79
  80. 80. (d) 15 3 8 19 22 언더플로우! 1 2 5 6 10 16 18 20 21 24 25 26 15 언더플로우! 3 병합! 19 22 1 2 5 6 8 10 16 18 20 21 24 25 26 병합! 3 15 19 22 1 2 5 6 8 10 16 18 20 21 24 25 26Spring 2012 Algorithms 80

×