[java] 트라이 알고리즘

트라이 알고리즘은 문자열 집합을 효율적으로 저장하고 검색하는 데 사용되는 자료구조입니다. 트라이는 트리의 형태를 가지고 있으며, 각 노드는 문자를 가리키는 포인터들을 가지고 있습니다.

트라이의 동작 원리

  1. 트라이의 루트 노드는 아무런 문자를 가리키지 않습니다.
  2. 문자열의 문자들을 하나씩 트라이에 삽입합니다.
  3. 각 문자마다 해당 문자를 가리키는 자식 노드가 있는지 확인합니다.
    • 자식 노드가 있다면, 해당 자식 노드로 이동합니다.
    • 자식 노드가 없다면, 새로운 노드를 생성하여 현재 노드의 자식으로 연결합니다.
  4. 문자열의 마지막 문자까지 위 과정을 반복한 후, 마지막 노드에는 해당 문자열의 종료 여부를 표시합니다.

트라이의 장점과 활용

트라이 알고리즘은 다음과 같은 장점을 가지고 있습니다.

트라이 알고리즘은 문자열 검색이 많이 필요한 애플리케이션에서 활용될 수 있습니다. 예를 들어, 오타 교정, 검색 엔진, 문자열 매칭 등의 분야에서 효과적으로 사용될 수 있습니다.

예시 코드

class TrieNode {
    private TrieNode[] children;
    private boolean isEndOfWord;

    public TrieNode() {
        children = new TrieNode[26]; // 알파벳 개수에 맞게 배열 크기 설정
        isEndOfWord = false;
    }

    public void insert(String word) {
        TrieNode current = this;
        for (char c : word.toCharArray()) {
            int index = c - 'a'; // 알파벳의 인덱스 계산
            if (current.children[index] == null) {
                current.children[index] = new TrieNode();
            }
            current = current.children[index];
        }
        current.isEndOfWord = true; // 문자열의 끝을 표시
    }

    public boolean search(String word) {
        TrieNode current = this;
        for (char c : word.toCharArray()) {
            int index = c - 'a';
            if (current.children[index] == null) {
                return false; // 문자열이 트라이에 존재하지 않음
            }
            current = current.children[index];
        }
        return current.isEndOfWord; // 문자열의 끝인지 확인
    }
}

public class Trie {
    public static void main(String[] args) {
        TrieNode trie = new TrieNode();

        trie.insert("apple");
        trie.insert("banana");
        trie.insert("grape");

        System.out.println(trie.search("apple")); // true
        System.out.println(trie.search("orange")); // false
    }
}

참고 자료