기록은 기억을 이기고 시간보다 오래 남는다.

Computer Science/Data Structure

이진 탐색(Binary search) with JS

준_준 2024. 5. 9. 16:37

이진 탐색:

빠르고 효율적인 데이터 검색 방법


이진 탐색은 정렬된 데이터에 대해 높은 효율성을 제공하는 검색 알고리즘입니다. 이 글에서는 이진 탐색의 기본 원리, 특징, 그리고 이진 탐색 트리를 포함한 다양한 구현 방법을 자세히 알아보겠습니다.


이진 탐색과 선형 탐색의 비교

  • 선형 탐색: 요소들을 순서대로 하나씩 확인하는 방식으로, O(n)의 시간 복잡도를 가집니다.
  • 이진 탐색: 정렬된 데이터를 반으로 나누어 탐색하는 방식으로, O(log n)의 시간 복잡도를 가집니다.

이진 탐색의 필수 조건

이진 탐색을 사용하기 위해서는 데이터가 반드시 정렬되어 있어야 합니다. 이 조건을 만족시킬 때, 이진 탐색은 매우 빠른 검색 속도를 제공할 수 있습니다.


이진 탐색의 구현 방법

  • 배열을 이용한 이진 탐색: 가장 기본적인 형태로, 중간 인덱스를 찾고 탐색 범위를 절반으로 줄이는 과정을 반복합니다. 배열에서 요소의 추가나 삭제가 필요할 때는 선형 시간이 소요되는 단점이 있습니다.
  • 이진 탐색 트리를 이용한 구현: 이진 탐색 트리는 동적인 데이터 집합에 적합하며, 데이터의 추가와 삭제가 용이합니다. 각 노드는 왼쪽 자식 노드가 부모 노드보다 작고, 오른쪽 자식 노드가 부모 노드보다 큰 값을 가집니다.

이진 탐색 트리의 문제점 및 해결 방법

이진 탐색 트리는 데이터의 삽입 순서에 따라 성능이 크게 달라질 수 있습니다. 최악의 경우, 트리가 한쪽으로 치우쳐 선형 탐색과 동일한 성능을 보일 수 있습니다. 이 문제를 해결하기 위해 다음과 같은 자료구조가 고안되었습니다:

  • AVL 트리: 균형을 자동으로 맞추는 자가 균형 이진 탐색 트리입니다.
  • 레드-블랙 트리: 삽입과 삭제 시에 트리의 균형을 유지하도록 설계된 구조로, 균형 잡힌 성능을 제공합니다.

자바스크립트에서 이진 탐색 트리 구현

class TreeNode {
    constructor(value) {
        this.value = value;
        this.left = null;
        this.right = null;
    }
}

class BinarySearchTree {
    constructor() {
        this.root = null;
    }

    insert(value) {
        const newNode = new TreeNode(value);
        if (!this.root) {
            this.root = newNode;
        } else {
            let current = this.root;
            while (true) {
                if (value < current.value) {
                    if (!current.left) {
                        current.left = newNode;
                        break;
                    }
                    current = current.left;
                } else {
                    if (!current.right) {
                        current.right = newNode;
                        break;
                    }
                    current = current.right;
                }
            }
        }
    }

    // 추가 메서드: 검색, 삭제 등
}
반응형