JAVA/CS 스터디

[CS 스터디: JAVA] (6) 트라이

Kamea 2022. 8. 11. 15:01

트라이(Trie) 

: 문자열 집합을 저장하고 탐색하기 위한 트리 형태의 자료 구조

: 자동완성 기능, 사전 검색등에 특화되어 있는 구조(단어의 앞글자부터 찾는)

   -- 예를 들어, "bear" 을 찾을 때 'b' 를 찾고 'e','a','r'를 순서대로 찾는다.

 

 

>> bell, bear, bore, bat, ball, stop, stock, stack을 저장한 트라이 트리 구조 

 

 

→ Trie 구조의 특징

(1) 항상 루트 노드는 null 노드 (여러개 집합의 문자열을 저장해야 하므로)

(2) 각각의 자식 노드들은 알파벳 순서대로 정렬

(3) 각각의 노드는 최대 26개의 자식을 가질 수 있음(A부터 Z까지)

(4) 루트 노드를 제외한 각각의 노드는 1개의 알파벳 노드를 저장할 수 있음

(5) 삽입하는 가장 긴 문자열의 길이가 L일 때, 탐색 시간 복잡도는 O(L)

 

 

→ Java 구현

 

public class Trie {
    static final int ALPHABET_SIZE = 26;
      
    static class TrieNode{
        TrieNode[] children = new TrieNode[ALPHABET_SIZE];
       
        boolean isEndOfWord; // 만약 노드가 단어의 끝이라면 true
          
        TrieNode(){
            isEndOfWord = false;
            for (int i = 0; i < ALPHABET_SIZE; i++)
                children[i] = null;
        }
    };
       
    static TrieNode root; 
      
    static void insert(String key){	// 키 삽입 
        int level;
        int length = key.length();
        int index;
       
        TrieNode pCrawl = root;
       
        for (level = 0; level < length; level++)
        {
            index = key.charAt(level) - 'a';
            if (pCrawl.children[index] == null)
                pCrawl.children[index] = new TrieNode();
       
            pCrawl = pCrawl.children[index];
        }
       
        // mark last node as leaf
        pCrawl.isEndOfWord = true;
    }
       
    static boolean search(String key){ // 키 탐색(존재시 true, 미존재시 false)
        int level;
        int length = key.length();
        int index;
        TrieNode pCrawl = root;
       
        for (level = 0; level < length; level++){
            index = key.charAt(level) - 'a';
       
            if (pCrawl.children[index] == null)
                return false;
       
            pCrawl = pCrawl.children[index];
        }
       
        return (pCrawl.isEndOfWord);
    }
       
    public static void main(String args[]){
        String keys[] = {"the", "a", "there", "answer", "any",
                         "by", "bye", "their"}; // 추가할 키 목록
       
        root = new TrieNode();
       
        int i;
        for (i = 0; i < keys.length ; i++)
            insert(keys[i]);	//	트리 생성
    }
}