문자열 탐색을 효율적으로 수행하기 위한 Tree 기반 자료구조이다. 문자열 검색, 자동완성, 사전 구현 등에 사용된다.
각 노드가 한개의 문자를 저장하는 트리 구조이다. 루트 노드는 공백이고, 각 간선은 문자를 나타낸다. 문자열이 삽입될 때, 각 문자의 경로를 따라 노드를 생성하고, 문자열의 끝을 나타내는 flag를 사용해 특정 단어가 저장되었음을 나타낸다.
Trie 기본 구조 (be,bee,can,cat,cd를 insert한 구조)
다음과 같은 연산을 지원한다.
기존 Trie 자료구조에 bed 단어 삽입
# Trie 자료구조
class Node(object):
def __init__(self,key,data=None):
self.key=key
self.data=data
self.child={}
class Trie(object):
def __init__(self):
self.head=Node(None) # key가 None인 Head 초기화
def insert(self,string):
curr_node=self.head # curr_node는 Node 클래스의 객체
for char in string:
if char not in curr_node.child: # string의 글자들이 child에 있는지 확인하기
curr_node.child[char]=Node(char) # char 문자를 key로 가지는 노드 생성(curr_node의 child로)
# curr_node의 child에 char가 있으면 해당 node로 이동!
curr_node=curr_node.child[char]
# 끝까지 이동한 이후 curr_node의 data에 string값 넣어줌
curr_node.data=string
def search(self,string):
curr_node=self.head
for char in string:
if char in curr_node.child:
curr_node=curr_node.child[char]
else:
return False
if curr_node.data is not None: # 탐색이 모두 종료된 이후에 data에 값이 들어있으면 탐색 완료!
return True
else:
return False
trie=Trie()
trie.insert('abc')
trie.insert('car')
print(trie.search('ab'))
print(trie.search('car'))