Trie는 문자열 탐색을 빠르게 수행할 수 있도록 설계된 트리 기반 자료구조
L에 대해 O(L)Trie에 들어있는 문자열:
apple, april
bus, busy, beer, best

isEnd == true면 True# Trie에서 각 노드를 나타내는 클래스
class TrieNode:
def __init__(self):
self.children = {} # 자식 노드를 담을 딕셔너리 (key: 문자, value: TrieNode)
self.is_end = False # 하나의 단어가 끝나는 지점을 표시하는 플래그
# Trie 전체를 관리하는 클래스
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 # 단어 끝에 도달했음을 표시
# 단어 전체가 Trie에 있는지 검색
def search(self, word):
node = self.root
for ch in word:
if ch not in node.children: # 해당 문자가 없으면 False
return False
node = node.children[ch] # 다음 문자로 이동
return node.is_end # 마지막 노드가 단어의 끝인지 확인
# 주어진 prefix로 시작하는 단어가 존재하는지 확인
def starts_with(self, prefix):
node = self.root
for ch in prefix:
if ch not in node.children: # 접두사 문자가 없으면 False
return False
node = node.children[ch] # 다음 문자로 이동
return True # 모든 접두사 문자를 순회했으면 True
trie = Trie()
trie.insert("cat")
trie.insert("car")
trie.insert("dog")
print(trie.search("car")) # True
print(trie.search("can")) # False
print(trie.starts_with("ca")) # True
print(trie.starts_with("do")) # True
| 연산 | 시간복잡도 |
|---|---|
| 삽입 | O(L) |
| 탐색 | O(L) |
| 접두어 탐색 | O(L) |
| 장점 | 단점 |
|---|---|
| 문자열 길이에 따라 일관된 탐색 속도 | 메모리 사용량 많음 |
| 접두어 검색, 자동완성 등 빠르게 구현 가능 | 각 노드마다 알파벳 수만큼 포인터 필요 |
| 해시 충돌 없음 | 문자열이 적거나 짧으면 비효율적 |