AVL Tree

2024. 6. 11. 21:10·CS/Data Structure
728x90
반응형

BST : 최악의 경우는 여전히 좋지 않음 -> AVL Tree로 이를 해결하고자 함

같은 자료, 다른 성능

같은 데이터를 가지고 있어도 다른 모양의 트리가 나올 수 있음

오른쪽 경우가 생기는 것을 막아보자

AVL Tree Idea

Root가 어떤 수인지에 따라서, 왼쪽과 오른쪽의 균형이 맞지 않을 수 있음 

양쪽의 노드의 개수가 비슷한 것을 선호 : 균형잡힌 트리

→ < 보정 > :  균형 잡힌 트리를 만들기 위해 root의 숫자를 바꿔주고, 트리의 모양을 바꿔줌

Root 뿐만 아니라 서브 트리의 root에서도 보정이 일어날 수 있음

 

AVL Tree Definition

기본 BST 정의에 추가되는 것 

  • Each Node has Two Labels : L & R - 각각의 서브트리의 높이
  • Condition : |L - R| < 2 즉, L,R이 높이 차이가 0, -1, 1이여야함 

→ 모든 노드에서 양쪽 서브트리의 노드 개수가 똑같아 지기 위해서 전체 노드 개수가 \(2^k-1\)개여야만 함

insert / delete가 일어나는 상황에서도 항상 조건을 유지해야함

 

Height Bound

N개의 노드가 있다면, Height는 O(log N)

→ Search가 O(log N)이 걸린다

 

< 왜 노드의 개수에 비해 height는 작을까? idea>

모든 서브트리에서 AVL 트리의 정의를 만족해야한다. 

만약 한쪽으로 쭉 진행된 트리가 있다면, 마찬가지로 조건을 맞추기 위해 반대쪽에도 비슷한 개수의 노드가 있어야한다

이 조건이 모든 노드를 기준으로 한 서브트리에서 만족해야하므로, 

처음에서 높이는 그대로지만, 조건에 맞춰 노드를 늘리다보면, 노드의 개수에 비해 height는 매우 작음을 확인할 수 있다. 

즉, 높이에 비해 노드 개수가 많다

 

Definition

Down Sequence Definition

  • String of L & R ex)LRLLRLRLRLRL
  • Represents Movment from root : 루트에서부터 따라 내려가는 방향을 표시한 것
  • down sequence는 언젠가는 가지 못하는 경우가 생긴다 - 자식이 없는 경우 

제일 마지막에 가지 못하는 Down Sequence를 Terminated Down Sequence 라고 하자

Proof : 노드의 개수에 비해 높이가 작다 == 높이에 비해 노드 개수가 많다

루트에서 가장 멀리 갈 수 있는 노드 (leaf) = 가장 먼 terminated down sequence

루트에서 가장 가까이 끝나는 노드 = 가장 가까운 terminated down sequence

* 루트에서 가장 긴 sequence의 레이블은 k, k-1, k-2 ... 0으로 진행됨 (1개씩 줄어듦)

* 루트에서 가장 짧은 sequence의 레이블은 k-1, k -3 ... 0으로 진행됨 (2개씩 줄어듦) + 맨 위에 레이블은 최대 1차이

루트에서 가장 가까이 끝나는 노드까지는 노드가 가득 차 있음 \(2^n\)개→ 균형잡힌 트리이기 때문임

주장을 증명하려면 : 가장 멀리갈 수 있는 노드와 가장 가까이 끝나는 노드와의 거리가 비슷하는 것을 보여야함

Count of nodes

If maximum label on Root is K 만약, 루트 라벨의 최대값이 K라면

Then the height of the Tree is K+1 트리의 높이는 K+1

Then the shortest Terminated down sequence is at least K/2 가장 짧은 terminated down sequence는 K/2

따라서 트리에는 shortest terminated down sequence까지 노드가 다 차있기 때문에 최소 \(2^{K/2}\)개의 노드 존재

노드의 개수 : \(2^{K/2} <= N <= 2^K\)

K/2 <= logN 이므로, K = O(log N)

트리의 높이가 logN이다

 

Q. How to keep the condition after an insert and delete

A. 특정 노드를 보정하여 루트로 만든다

 

Insert

  1. Do the normal insert -> leaf에 하는 것 그대로
  2. come back up the tree and recompute Label 위로 올라가 리턴하면서 라벨을 다시 설정 (최대 1증가)
  3. For the first Node to break the condition, perform ROTATION 조건이 깨지는 노드에서 보정

조건이 깨지기 위해서는 K쪽에서 insert가 일어나야함

* 만약 K-1에서 insert가 일어난다면 K가 되기 때문에 조건이 깨지지 않음

 

새로 추가된 노드는 조건이 깨진 노드에서 최소 두 노드 아래에 있어야함

→ 만약, 바로 아래에 있는 노드에 추가된것이라면 0 -> 1이 된 것이고, 그 전에 조건을 유지중이였으므로 2 이상 차이가 날 수 없음

즉 두 레벨을 더 내려가서 생각해야함

따라서 발생할 수 있는 경우의 수는 LL LR RL RR 총 4가지가 존재

(그림에 따르면, k-1 = 0일때 새로 생긴 노드는 D 혹은 E일 수도 있음, 그 아래 서브트리를 통틀어서 생각해도 됨)

 

Q. B가 왜 K-1 K-1로 같은가?

A. 만약 B의 서브트리 중 하나에 노드가 하나 추가된다면, 한 쪽에 +1이 될 것이다. 따라서 무조건 1의 차이가 생기게 되는데, 만약 B의 라벨이 k-2와 k-1이였다면, k-1에 노드가 하나 추가될 때, 균형이 깨지므로 A가 첫번째로 조건이 깨진 트리라는 전제가 깨지게 된다

 

*Case는 *첫번째로 condition이 깨지는 경우를 의미!

Case LL

D, 혹은 D의 서브트리에 insert

  • B를 부모노드, A는 B의 자식노드가 됨
  • A의 부모노드가 있었다면, A의 부모노드는 B를 가리킴
  • E는 A의 왼쪽 노드가 됨

결과

  • B의 라벨은 K, K (왼쪽에 insert가 되고, A가 B의 자식노드가 되면서 하나가 늘어남)
  • A의 라벨은 K-1, K-1 (왼쪽 자식노드였던 B가 올라가면서 왼쪽 노드가 하나 줄어듦)

Case LR

E,F,G가 존재하지 않을 수도 있음


E, 혹은 E의 서브트리에 insert

  • E가 부모노드가 됨
  • B는 E의 왼쪽, A는 E의 오른쪽 노드가 됨
  • F가 있다면, B의 오른쪽 노드, G가 있다면 A의 왼쪽 노드

결과

  • B의 오른쪽 노드는 E가 올라가면서 K-2가 됨 - 만약 F에 insert된거라면, K-1이 됨
  • A의 왼쪽 노드는 E가 올라가면서 K-2가 됨 - 만약 G에 insert된거라면, K-1이 됨
  • E는 양쪽 모두 K 라벨을 가짐 (B는 왼쪽, A는 오른쪽에 무조건 K-1개의 노드를 가지기 때문)

Case RL

RL에 즉, C아래에 노드 T가 추가된다고 가정

  • RL에 있는 노드가 부모노드가 됨 (T가 부모 노드가 됨)
  • T의 왼쪽 노드는 A, T의 오른쪽 노드는 C
  • 나머지는 LR과 같은 방식으로 자식 노드로 들어가게 됨 (A의 오른쪽, C의 왼쪽)

Case RR

RR에 즉, C 오른쪽에 노드 S가 추가된다고 가정

  • 노드 C가 부모 노드가 됨
  • 노드 C를 기준으로 노드 A는 왼쪽, 노드 S는 오른쪽 노드가 됨
728x90
반응형

'CS > Data Structure' 카테고리의 다른 글

Priority Queue  (2) 2024.06.12
AVL Tree Variation(2-3 Tree, 2-3-4 Tree, Red-Black Tree, skip list)  (3) 2024.06.12
Binary Search Tree  (0) 2024.04.24
Equivalence class 코딩  (0) 2024.04.23
Linked List  (2) 2024.04.21
'CS/Data Structure' 카테고리의 다른 글
  • Priority Queue
  • AVL Tree Variation(2-3 Tree, 2-3-4 Tree, Red-Black Tree, skip list)
  • Binary Search Tree
  • Equivalence class 코딩
min_zu
min_zu
  • min_zu
    민주제도
    min_zu
  • 전체
    오늘
    어제
    • ._. (176)
      • AI (2)
        • DeepLearning (2)
        • CS231n (0)
      • Web (2)
        • ReactJS (0)
      • CS (83)
        • OS (7)
        • Data Structure (23)
        • Computer Architecture (8)
        • Computer Network (20)
        • Algorithm (25)
      • Linux (3)
        • KaliLinux (0)
        • Docker (1)
      • Hacking (83)
        • Write Up (25)
        • Pwnable (13)
        • Reversing (2)
        • Cryptography (12)
        • Web Hacking (4)
        • Window (6)
        • Network (7)
        • Web3 (13)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    AI
    Graph
    OS
    DataStructure
    WinAFL
    Mac
    Search
    Linux
    DeepLearning
    UTM
    Sort
    ComputerArchitecture
    Tree
    Web
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
min_zu
AVL Tree
상단으로

티스토리툴바