본문 바로가기
카테고리 없음

이진 탐색 트리(BST)와 AVL 트리의 성능 비교

by favorites 2024. 12. 19.

이진 탐색 트리(BST)와 AVL 트리의 성능 비교

균형 트리와 일반 트리의 성능 차이를 검색, 삽입, 삭제 속도 측면에서 비교해 보겠습니다.

 

1️⃣ 이진 탐색 트리(BST)란?

이진 탐색 트리(Binary Search Tree, BST)는 노드의 왼쪽 자식은 부모보다 작고, 오른쪽 자식은 부모보다 큰 값을 가지는 이진 트리입니다. 이 특성을 통해 데이터를 효율적으로 정렬 및 검색할 수 있습니다.

하지만 BST는 삽입 순서에 따라 트리의 균형이 깨질 수 있으며, 이 경우 최악의 시간 복잡도는 O(n)이 됩니다.

 

2️⃣ AVL 트리란?

AVL 트리는 균형 이진 탐색 트리(Self-Balancing BST)로, 모든 노드의 왼쪽과 오른쪽 서브트리 높이 차이가 1을 넘지 않도록 유지합니다. AVL 트리는 데이터 삽입 및 삭제 시 트리의 균형을 유지하기 위해 회전(Rotation)을 수행합니다.

이를 통해 최악의 경우에도 검색, 삽입, 삭제 작업의 시간 복잡도가 O(log n)으로 유지됩니다.

 

3️⃣ 성능 비교: 검색, 삽입, 삭제

BST와 AVL 트리의 성능을 비교하면 다음과 같습니다:

작업 BST AVL 트리
검색 O(h) (최악: O(n)) O(log n)
삽입 O(h) (최악: O(n)) O(log n) (회전 포함)
삭제 O(h) (최악: O(n)) O(log n) (회전 포함)

여기서 h는 트리의 높이를 의미합니다.

 

4️⃣ BST와 AVL 트리 구현

✅ BST 구현

# Python으로 BST 구현
class Node:
    def __init__(self, key):
        self.key = key
        self.left = None
        self.right = None

def insert(node, key):
    if not node:
        return Node(key)
    if key < node.key:
        node.left = insert(node.left, key)
    else:
        node.right = insert(node.right, key)
    return node

def search(node, key):
    if not node or node.key == key:
        return node
    if key < node.key:
        return search(node.left, key)
    return search(node.right, key)
            

✅ AVL 트리 구현

# Python으로 AVL 트리 구현 (회전 포함)
class AVLNode:
    def __init__(self, key):
        self.key = key
        self.height = 1
        self.left = None
        self.right = None

def get_height(node):
    return node.height if node else 0

def rotate_right(y):
    x = y.left
    T2 = x.right
    x.right = y
    y.left = T2
    y.height = max(get_height(y.left), get_height(y.right)) + 1
    x.height = max(get_height(x.left), get_height(x.right)) + 1
    return x

def rotate_left(x):
    y = x.right
    T2 = y.left
    y.left = x
    x.right = T2
    x.height = max(get_height(x.left), get_height(x.right)) + 1
    y.height = max(get_height(y.left), get_height(y.right)) + 1
    return y

def insert_avl(node, key):
    if not node:
        return AVLNode(key)
    if key < node.key:
        node.left = insert_avl(node.left, key)
    else:
        node.right = insert_avl(node.right, key)

    node.height = 1 + max(get_height(node.left), get_height(node.right))
    balance = get_height(node.left) - get_height(node.right)

    if balance > 1 and key < node.left.key:
        return rotate_right(node)
    if balance < -1 and key > node.right.key:
        return rotate_left(node)
    if balance > 1 and key > node.left.key:
        node.left = rotate_left(node.left)
        return rotate_right(node)
    if balance < -1 and key < node.right.key:
        node.right = rotate_right(node.right)
        return rotate_left(node)

    return node
            

 

5️⃣ 활용 사례

  • BST: 데이터가 잘 정렬된 경우, 간단한 데이터 검색 및 삽입.
  • AVL 트리: 대규모 데이터 처리 및 균형 유지가 중요한 시스템.

 

결론

이진 탐색 트리(BST)와 AVL 트리는 서로 다른 장단점을 가진 자료구조입니다. BST는 단순하고 구현이 용이하지만, 균형이 깨질 경우 성능이 저하됩니다. 반면, AVL 트리는 트리 균형을 유지하여 항상 안정적인 성능을 제공합니다.

개인적으로, AVL 트리는 컴퓨터 과학에서 효율성과 안정성을 모두 고려해야 하는 문제에서 필수적인 자료구조라고 생각합니다. 특히, 대규모 데이터 처리와 검색 속도가 중요한 환경에서는 AVL 트리의 활용 가치가 매우 큽니다.

자료구조 선택은 문제의 특성과 요구 사항에 따라 달라집니다. BST와 AVL 트리의 차이점을 이해하고 적절한 상황에 맞게 활용하며, 더 나은 시스템 설계를 위한 경험을 쌓아보세요!

 

© 2024 favorites. All rights reserved.