Trie
Trie
Trie란?
- 문자열 검색을 빠르게 해주는 트리 구조
- 정수형 자료에 대해 이진트리로 검색하면 O(log n)이지만 문자열을 검색하면 문자열 최대 길이가 M일 때, O(M log n)
- 노드에 들어가서 매번 문자열의 길이만큼 비교해야 함
- 문자열 한 자가 한 노드에 가도록 저장
- 빠르게 탐색 가능하지만 각 노드에서 자식들에 대한 포인터들을 배열로 모두 저장하고 있어서 저장 공간의 크기가 큼
- 활용 : 자동 완성 및 검색어 추천
시간복잡도
가장 긴 문자열의 길이가 m, 문자열의 개수 n일 때
- 생성 : O(m*n)
- 삽입 : O(m)
- 검색 : O(m)
구현
- Node를 이용한 Tree 형태
- 문자열의 끝임을 알려주는 flag 존재
1) Node
class Node(object):
def __init__(self, key, data=None):
self.key = key # 노드에 입력할 문자 (값)
self.data = data # 문자열의 종료를 알리는 flag
self.children = {} # 자식 노드
2) Trie
class Trie:
# 빈 노드를 헤드로 초기화
def __init__(self):
self.head = Node(None)
# insert : 트리 생성
def insert(self, string):
cur_node = self.head # head에서 시작
for char in string: # 문자열의 문자를 하나씩 확인
# 현재 노드의 자식 중에 문자가 없다면 자식 노드에 추가
if char not in current_node.children:
cur_node.children[char] = Node(char)
# 자식 중에 있다면 cur_node를 자식 노드로 변경
cur_node = cur_node.children[char]
# 문자열을 끝까지 탐색했다면 마지막 노드에 data추가
cur_node.data = string
# string 검색
def search(self, string):
cur_node = self.head # head에서 시작
for char in string : # 문자열의 문자를 하나씩 확인
# 현재 노드의 자식 중 문자에 해당하는 노드가 존재한다면 cur_node를 자식 노드로 변경
if char in cur_node.children:
cur_node = cur_node.children[char]
# 현재 노드의 자식 중 문자에 해당하는 노드가 없다면 False
else:
return False
# 문자열 끝까지 탐색하여 마지막 노드에 데이터가 존재한다면 True
if cur_node.data :
return True
# 문자열 끝까지 탐색하여 마지막 노드에 데이터가 없다면 False
else:
return False
관련 문제
참고 자료
- [자료구조 알고리즘] Trie(트라이) Tree에 대해서
- 코딩테스트, 기초, Trie, 문자열 트리, 트라이
- Trie 자료구조 [Python / 파이썬]
- 210126 개발일지(50일차) - 트라이(Trie) 알고리즘 개념 및 파이썬에서 구현하기(feat. Class)
Leave a comment