: 문자열을 저장하고 효율적으로 탐색하기 위한 트리 형태의 자료 구조
L
이 문자열의 길이일 때 탐색, 삽입은 O(L)
만큼 걸린다.문자열의 개수 * 문자열의 길이
만큼 시간복잡도를 가지지만, 트라이를 이용하면 찾는 문자열의 길이만큼만 시간복잡도가 걸린다.class Node {
constructor(value ='') {
this.value = value;
this.children = new Map();
}
}
// Node {value: '', children: Map(0)}
class Trie {
constructor() {
this.root = new Node();
}
insert(string) { // string = 'cat'
let currentNode = this.root; // root부터 탐색을 시작한다.
for (const char of string) { // 문자열을 맨 앞부터 문자 하나씩 순회한다. char = 'c'
if (!currentNode.children.has(char)) { // 현재 노드가 'c'를 간선으로 가지고 있지 않다면,
currentNode.children.set(char, new Node(currentNode.value + char)); // 새롭게 노드를 추가한다.
// Node {value:'', children: Map(1) {'c' => Node}}
}
currentNode = currentNode.children.get(char); // 그러고나서 char 노드로 이동한다.
// 'c' 간선이 이어진 노드로 이동
// Node {value: 'c', children: Map(0)}
}
}
has(string) {
let currentNode = this.root;
for (const char of string) {
if (!currentNode.children.has(char)) {
return false;
}
currentNode = currentNode.children.get(char);
}
return true;
}
}
const trie = new Trie();
trie.insert('cat');
trie.insert('can');
console.log(trie.has('cat')); // true
console.log(trie.has('can')); // true
console.log(trie.has('cap')); // false
이렇게 구현한 위의 트라이 자료구조는 아래처럼 생겼을 것이다.
자료구조는 매번 볼때마다 어렵네요. class 문법도 잘쓰시니 대단합니다!