[JAVA/자료구조] 트라이 (Trie)

트라이

1. 클래스

구조

2. 특징

  • 정렬된 트리 구조이다.
  • 자식노드를 맵<key, value> 형태로 가지고 있다.
  • 루트를 제외한 노드의 자손들은 해당 노드와 공통 접두어를 가진다.

3. 선언

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.util.HashMap;
/**
 *
 * @author HEESOO
 *
 */
class Trie{
	Node root;
	
	public Trie() {
		this root=new Node();
	}
	public void insert(String word) {
		Node node root;
		for(int i=0;i<word.length();i++) {
			node.count++;
			node=node.children.computeIfAbsent(word.charAt(i), c->new Node());
		}
	}
	public int getCount(String query) {
		Node node=root;
		for(int i=0;i<query.length();i++) {
			if(!node.children.containsKey(query.charAt(i))) return 0;
			node=node.children.get(query.charAt(i));
		}
		return node.count;
	}
}
class Node{
	HashMap<Character, Node> children;
	int count;
	
	public Node(){
		this.children=new HashMap<>();
		this.count=0;
	}
}

4. 주요 메소드

  1. Node
    • 자식노드는 HashMap에 저장된다.
    • 현재 노드까지의 같은 접두사를 가지는 노드의 개수를 count에 저장한다.
  2. public void insert(String word)
    • 역할: word를 트라이에 저장한다.
    • computeIfAbsent()를 통해 word.charAt(i)가 node.children에 없다면 해시맵에 넣은 후, 해당 노드로 이동한다.
  3. public int getCount(String query)
    • 역할: query가 존재한다면, 그 개수를 리턴한다.

7. 참고