Trie는 문자열 탐색에 최적화된 트리 기반 자료구조다.
접두사(prefix)를 기준으로 노드를 구성하며, 단어들의 공통된 접두사를 한 번만 저장하므로 메모리 효율이 뛰어나다.
자동완성, 사전 검색, 추천 시스템 등에 널리 사용된다.
is_end
표시를 가질 수 있다.단어: ["cat", "car", "cart", "dog"]
를 삽입하면 다음과 같은 구조가 된다.
(root)
├── c
│ └── a
│ ├── t (is_end=True) ← "cat"
│ └── r (is_end=True) ← "car"
│ └── t (is_end=True) ← "cart"
└── d
└── o
└── g (is_end=True) ← "dog"
is_end = True
로 표시한다.is_end
가 True
이면 문자열이 존재한다.is_end
와는 관계없이 노드가 존재하면 된다.class TrieNode:
def __init__(self):
self.children = {}
self.is_end = False
class Trie:
def __init__(self):
self.root = TrieNode()
# 단어 삽입
def insert(self, word):
node = self.root
for ch in word:
if ch not in node.children:
node.children[ch] = TrieNode()
node = node.children[ch]
node.is_end = True
# 단어 검색
def search(self, word):
node = self._find_node(word)
return node is not None and node.is_end
# 접두사 검색
def starts_with(self, prefix):
return self._find_node(prefix) is not None
# 공통 로직 분리
def _find_node(self, prefix):
node = self.root
for ch in prefix:
if ch not in node.children:
return None
node = node.children[ch]
return node
trie = Trie()
trie.insert("cat")
trie.insert("car")
trie.insert("cart")
trie.insert("dog")
print(trie.search("car")) # True
print(trie.search("care")) # False
print(trie.starts_with("ca")) # True
print(trie.starts_with("do")) # True
print(trie.starts_with("du")) # False