9. AVL 트리
반응형
AVL 트리는 모든 내부노드 v에 대해, v의 좌우 자식들의 높이 차이가 1을 넘지 않는 이진 탐색 트리이다.
AVL 트리의 부트리 역시 AVL 트리이며, 높이 정보는 각 내부 노드에 저장된다.
AVL 트리의 높이균형 속성 덕분에, n개의 원소를 저장하는 AVL 트리의 높이는 O(logn)이 보장된다. (이진 탐색 트리는 최악의 경우 O(n))
AVL 트리에서의 삽입/삭제
AVL 트리에서 원소의 삭제와 삽입은 이진 탐색 트리와 유사하나, 삽입 혹은 삭제로 인해 AVL 트리의 높이균형 속성이 파괴될 수 있으므로 이를 복원해주는 작업이 추가된다.
삽입
def insertItem(k, e): w = treeSearch(root(), k) if isInternal(w): raise Exception("Key Already Exists!") w.elem = e w.key = k expandExternal(w) searchAndFixAfterInsertion(w) # 이 부분이 추가된다. return
def searchAndFixAfterInsertion(w): z = w while !isRoot(z): z = w.parent() # 루트까지 거슬러 올라가다가 if !rightBalance(z): # 처음 만난 밸런스 깨진 노드가 z가 된다. break if isRoot(z) and rightBalance(z): # 만약 루트까지 전부 정상이면 리턴 return y = higherChild(z) # y는 z의 높은 자식 x = higherChild(y) # x는 y의 높은 자식 restructure(x, y, z) # 균형을 복구한다. 하위 트리의 균형이 복구되면 루트까지 모든 균형이 복구된다. return
def reconstructure(x,y,z): a,b,c,t0,t1,t2,t3 = inorder(x,y,z) # x,y,z의 중위순회 순서와, x,y,z를 제외한 나머지 4개의 부트리 swap(z, b) # 루트를 b로 바꾸고 a.left = t0 a.right = t1 c.left = t2 c.right =t3 b.left = a b.right = c return b
삭제
def removeElement(k): w = treeSearch(root(), k) if isExternal(w): raise Exception("No Such Key!") e = w.elem z = leftChild(w) if !isExternal(z): z = rightChild(w) if isExternal(z): # 자식 중 외부노드 존재 zs = reduceExternal(z) # 그냥 지우기 else: y = inOrderSucc(w) # 중위순회 후계자 탐색 z = leftChild(y) w.key = y.key w.elem = y.elem zs = reduceExternal(z) searchAndFixAfterRemoval(zs) # 균형 복구 return e
def searchAndFixAfterRemoval(w): z = w while !isRoot(z): z = w.parent() # 루트까지 거슬러 올라가다가 if !rightBalance(z): # 처음 만난 밸런스 깨진 노드가 z가 된다. break if isRoot(z) and rightBalance(z): # 만약 루트까지 전부 정상이면 리턴 return y = higherChild(z) if (y.left.height == y.right.height): # y 의 두 자식의 높이가 같으면 if isLeft(y): # y랑 같은 쪽을 자식으로 x = y.left else: x = y.right else: x = higherChild(y) b = reconstructure(x,y,z) if isRoot(w): return else: searchAndFixAfterRemoval(w.parent()) #루트까지 재귀 반복
AVL 트리의 성능
AVL 트리를 이용하여 구현된 원소 n개의 사전은 O(n) 공간과 O(logn) 높이를 가진다.
- 3 노드를 개조하는 reconstructure 작업은 O(1) 시간
- findElement는 O(logn) 시간
- insertItem, removeElement는 O(logn) 시간이 소요된다.
- 초기의 treeSearch에 O(logn)
- 균형 복구에 O(logn)
반응형
'학부 수업 > 알고리즘' 카테고리의 다른 글
11. 해시테이블의 충돌 해결 (0) | 2020.11.05 |
---|---|
10. 해시테이블 (Hash Table) (0) | 2020.11.05 |
8. 이진 탐색 트리 (Binary Search Tree) (0) | 2020.10.13 |
7. 사전 ADT (Dictionary ADT) (0) | 2020.10.08 |
6. 비교 기반 정렬 알고리즘(Comparison-based Sorting) (0) | 2020.09.29 |
댓글
이 글 공유하기
다른 글
-
11. 해시테이블의 충돌 해결
11. 해시테이블의 충돌 해결
2020.11.05 -
10. 해시테이블 (Hash Table)
10. 해시테이블 (Hash Table)
2020.11.05 -
8. 이진 탐색 트리 (Binary Search Tree)
8. 이진 탐색 트리 (Binary Search Tree)
2020.10.13 -
7. 사전 ADT (Dictionary ADT)
7. 사전 ADT (Dictionary ADT)
2020.10.08
댓글을 사용할 수 없습니다.