AVL트리

seonghun park·2022년 6월 2일
0

AVL Tree란?

AVL트리란 스스로 균형을 잡아주는 트리이다.
AVL트리는 BST의 일종으로 트리의 h에 따라 수행시간이 결정되는 BST특성에서 O(n)이 되지 않도록 잡아주는 역할을 한다.
이를 위해서 중요한 조건을 만족한다.

  • 자식의 높이 차가 최대 1이다.

AVL트리의 높이

  • n개의 키를 저장하는 AVL 트리의 height는 O(log n)이다.
    증명: 인터널 노드의 최소 수 n(h)도입
    n(1) = 1, n(2) = 2
    n>2에 대하여, 루트 노드 + 깊은 서브트리 + 낮은 서브트리 == 1 + n(h-1) + n(h-2).

예시로 h가 3일 때 최소 인터널 노드의 개수 n(3)을 구해보자.

이 페이지를 이해하기 위해 다음 증명식을 참고하자.

Insertion

  • 삽입은 이진탐색트리를 이용한다.
  • 항상 leaf노드 두개를 추가해주어야 한다.
  • 위반된 순서균형을 맞추기 위해 Restrucuring과정을 수행한다.
    - 이를 위해 zyx, abc를 규정해주어야 한다는 것을 유념하고 다음을 보자

z = 균형이 맞지 않는 레벨의 internal 노드 (insert와 removal의 결과로 예측한 결과이기에 틀릴 수도 있다.)
y = z의 자식 중 height가 높은 것
x = y의 자식 중 height가 높은 것

abc 순서 -> inorder 순서

위 그림은 54를 삽입한 예시이다.
먼저 이진탐색트리의 규칙을 통해 숫자를 삽입한다.
하지만 레벨1과 레벨2에서 AVL트리의 height규칙을 위반한 것을 알 수 있다.
아래서부터 시작해서 처음 균형이 어긋난 노도의 parent를 z, 그 후로 순서를 메긴다.
또한 inorder에 맞게 a~ 순서를 메긴다.
아래 그림처럼 restructuring

이때 서브트리가
하나만 이동하는 것을 -> single rotation
두개가 이동하는 것을 -> double rotation 이라 함.

결과적으로 AVL트리의 삽입 = 이진탐색트리 + restructuring 이다.

1) binary search tree 와 동일한 방법으로 삽입 ⇒ O(log n)
2) 삽입한 곳으로부터 올라가며 문제가 발생하는지 확인 ⇒ O(log n)
3) z,y,x 크기 비교, a,b,c 설정 ⇒ O(1)
4) 서브트리 T1 or T1, T2 옮기기 ⇒ O(1)
의 과정을 거치므로 총 수행시간은 "O(log n)" 이 된다.

Removal

removal 과정도 삽입과정과 유사한 알고리즘이므로 참고 사진만을 첨부하겠다.

AVL 트리의 Performance

  • find - O(log n)

  • insert - O(log n)` 시간이 걸린다.

  • erase - O(log n)
    ⇒ AVL 트리는 모든 연산시간이 O(log n) 시간이 걸린다.

profile
hun의 PS 블로그입니다:)

0개의 댓글