자료구조와 알고리즘
[JS] 트라이
AgileJung
2022. 8. 31. 11:16
728x90
반응형
검색의 자동완성 기능을 구현할 때 적합한 자료구조
문자열을 저장하고 효율적으로 탐색하기 위한 트리 형태의 자료구조
특징
- 찾는 문자열의 길이만큼만 시간 복잡도가 걸린다.
- 저장공간을 좀 더 많이 사용한다.
구조
루트는 비어있다.
각 간선은 추가될 문자를 키로 가진다.
각 정점은 이전 간선의 키를 값으로 가진다.
해시 테이블과 연결 리스트를 사용한다.
트리 생성하기
function makeTrie(words) {
const root = {}; // 먼저 루트 노드를 설정할 변수를 만든다.
for (const word of words) { // Trie를 구성하기 위한 루프를 돌린다.
let current = root; // 루프부터 시작
for (const letter of word) { // 단어의 글자를 하나씩 춫출한 후
if (!current[letter]) current[letter] = [0, {}]; // 값을 넣는다. 리스트의 첫 번째 값은 학습된 단어가 몇 개인지를 카운팅하고 두 번째 값은 트리 구조로 이용할 노드 값으로 사용한다.
current[letter][0] = 1 + (current[letter][0] || 0); // 카운팅을 위해 1 더해준다.
current = current[letter][1]; // current는 letter에 해당되는 노드로 이동한다.
}
}
return root; // 반환
}
트라이
class Node {
constructor(value = ""){
this.value = value;
this.children = new Map();
}
}
class Trie {
constructor(){
this.root = new Node();
}
insert(string){
let currentNode = this.root;
for(const char of string){
if(!currentNode.children.has(char)){
currentNode.children.set(
char, new Node(currentNode.value + char)
);
}
currentNode = currentNode.children.get(char);
}
}
// 확인
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;
}
}
728x90
반응형