자료구조

[자료구조] 트라이

라임온조 2023. 5. 10. 11:11

1. 개념

문자열 검색을 빠르게 실행할 수 있도록 설계한 트리 형태의 자료구조.

각 노드는 문자 혹은 문자열의 한 글자를 나타낸다. 또한, 각 노드는 자식을 가지고 있을 수 있는데, 이는 각 노드의 다음 문자를 나타낸다.

 

2. 특징

  • 루트 노드는 항상 공백이다.
  • N진 트리의 형식을 가진다. 문자 종류에 따라 N이 결정된다. 알파벳은 26개의 문자로 이루어져 있기 때문에 26진 트리 형태를 갖게 된다. 즉 부모 노드가 자식을 최대 26개까지 가질 수 있다는 것이다.
  • 각 문자의 접두사를 공유하기 때문에 검색이 빠르다. 
  • 트리 형태로 문자를 저장하기 때문에 삽입과 삭제 연산이 빠르다. 조건을 만족한다면 상수시간 안에도 가능하다.

 

3. 구현

// 트라이에서 사용하는 노드 정의
class tNode{
    tNode[] next = new tNode[26];
    boolean isEnd;
}

// 트라이 구조 만들기
        while(N > 0){
            String str = br.readLine();
            tNode now = root;
            for(int i = 0; i<str.length(); i++){
                char ch = str.charAt(i);
                if(now.next[ch-'a'] == null){ // 다음 위치가 null 이니 거기에 새로운 노드 생성해서 집어넣기
                    now.next[ch-'a'] = new tNode();
                }
                now = now.next[ch-'a']; // 생성해서 집어 넣었다면 그게 현재 위치가 되는 거고, 집어넣지 않았다면 뭔가 있던 곳이 현재 위치가 되는 것
                if(i == str.length()-1){ // 만약 문자열 맨 마지막이라면 끝이라고 표시하기기
                    now.isEnd = true;
                }
            }
            N--;
        }
        
  // 트라이 검색      
  int count = 0;
        while(M > 0){
            String str = br.readLine();
            tNode now = root;
            for(int i = 0; i<str.length(); i++){
                char c = str.charAt(i);
                if(now.next[c-'a'] == null){ // 다음 노드를 찾는데 내가 찾는게 없으면 그 문자열은 없다는 의미이니 종료
                    break;
                }
                now = now.next[c-'a'];
                if(i == str.length() -1 && now.isEnd){ // 현재 살피는 문자열의 마지막이면서 비교 대상도 마지막이면 같다는 것이니 답 증가
                    count++;
                }
            }
            M--;
        }

 

4. 관련 문제

백준 14425

 

GitHub - Lee-Min-Jung/coding_test_practice

Contribute to Lee-Min-Jung/coding_test_practice development by creating an account on GitHub.

github.com

 

'자료구조' 카테고리의 다른 글

[자료구조] 힙  (0) 2023.07.11
[자료구조] 이진 트리  (0) 2023.05.10
[자료구조] 트리  (0) 2023.05.09
[자료구조] 그래프  (0) 2023.04.19
[자료구조] 그래프의 표현  (0) 2023.04.14