Algorithm

트라이(Trie) 자료구조

ByteBridge 2025. 3. 22. 10:04
반응형

트라이(Trie) 자료구조란?

트라이(Trie)는 문자열을 효율적으로 탐색하고 저장하기 위한 트리 형태의 자료구조입니다. 특히 문자열이 포함되어 있는지 빠르게 확인하거나, 자동 완성 및 검색 추천과 같은 기능을 구현할 때 유용하게 사용됩니다. 트라이는 문자열의 접두사(prefix)를 기반으로 데이터를 관리하여, 중복되는 접두사를 공유하여 메모리를 절약합니다.

트라이의 특징

  • 트라이는 루트에서부터 문자열의 각 문자를 노드로 가지는 트리 형태입니다.
  • 같은 접두사를 가진 문자열끼리는 공통의 경로를 공유합니다.
  • 문자열의 길이가 길어져도 탐색 속도는 문자열의 길이에 비례하여 빠르게 유지됩니다.
  • 검색, 자동 완성, 사전 검색 등에 효율적으로 사용됩니다.

트라이의 구조

  • 각 노드는 문자와 자식 노드에 대한 참조를 가지고 있습니다.
  • 마지막 문자 노드는 보통 "end of word" 표시를 통해 문자열의 끝임을 나타냅니다.
예시: ["car", "cat", "dog"] 저장 시

root
├── c
│   └── a
│       ├── r [끝]
│       └── t [끝]
└── d
    └── o
        └── g [끝]

트라이의 장단점

장점

  • 문자열 탐색 속도가 빠릅니다.
  • 접두사를 공유하여 메모리를 절약할 수 있습니다.
  • 자동 완성과 같은 기능 구현에 적합합니다.

단점

  • 각 노드가 여러 개의 자식 노드를 저장하는 구조로 인해 메모리 사용량이 많아질 수 있습니다.
  • 구현이 다소 복잡합니다.

트라이의 활용 사례

  • 검색 엔진의 자동 완성 및 추천 시스템
  • 전화번호부와 같은 연락처 관리 시스템
  • 사전 및 스펠 체크 프로그램
  • IP 라우팅 테이블

간단한 구현 예시 (자바)

import java.util.HashMap;
import java.util.Map;

class TrieNode {
    Map<Character, TrieNode> children = new HashMap<>();
    boolean endOfWord;

    TrieNode() {
        endOfWord = false;
    }
}

public class Trie {
    private TrieNode root;

    public Trie() {
        root = new TrieNode();
    }

    public void insert(String word) {
        TrieNode node = root;
        for (char ch : word.toCharArray()) {
            node = node.children.computeIfAbsent(ch, c -> new TrieNode());
        }
        node.endOfWord = true;
    }

    public boolean search(String word) {
        TrieNode node = root;
        for (char ch : word.toCharArray()) {
            node = node.children.get(ch);
            if (node == null) return false;
        }
        return node.endOfWord;
    }

    public static void main(String[] args) {
        Trie trie = new Trie();
        String[] words = {"car", "cat", "dog"};
        for (String word : words) {
            trie.insert(word);
        }

        System.out.println(trie.search("car"));  // true
        System.out.println(trie.search("cap"));  // false
    }
}

트라이(Trie)는 문자열을 다룰 때 매우 유용하고 효율적인 자료구조입니다. 다양한 문자열 검색 및 추천 기능을 구현할 때 적극적으로 활용해 보시길 바랍니다.

반응형