Trie
: 트라이(Trie)란 문자열을 저장하고 효율적으로 탐색하기 위한 트리 형태의 자료구조이다.DFS
형태로 검색을 하면, to, tea, ted, ten, inn, in, inn 이라는 단어들이 자료구조에 들어가 있음을 알 수 있다.L
, 총 문자열들의 수를 M
이라 할 때 시간 복잡도는O(ML)
, 모든 문자열들을 넣으려니 M
개에 대해서 트라이 자료구조에 넣는건 가장 긴 문자열 길이만큼 걸리니 L
만큼 걸려서 O(ML)
만큼 걸린다. 물론 삽입 자체만은 O(L)
만큼 걸린다.O(L)
, 트리를 타고 들어가봤자 가장 긴 문자열의 길이만큼만 탐색하기 때문에 O(L)
만큼 걸린다.class Node(Object):
def __init__(self, key, data=None):
self.key = key
self.data = data
self.children = {}
노드에는 세가지가 필요하다.
class Trie:
def __init__(self):
self.head = Node(None)
def insert(self, string):
current_node = self.head
for char in string:
if char not in current_node.children: # 해당 알파벳이 자식 노드에 존재하지 않을 시
current_node.children[char] = Node(char) # 새 노드 생성 후 자식 노드로 지정
current_node = current_node.children[char]
current_node.data = string # 문자열을 이루는 마지막 노드의 data에 string을 추가
def search(self, string):
current_node = self.head
for char in string:
if char in current_node.children: # 자식 노드가 char를 가지고 있을 경우 탐색 진행
curreent_node = current_node.children[char]
else:
return False
if current_node.data: # 마지막 노드가 data를 가지면 문자열인 관계로 True 반환
return True
else:
return False
def starts_with(self, prefix):
current_node = self.head
words = []
for p in prefix:
if p in current_node.children:
current_node = current_node.children[p]
else:
return None
current_node = [current_node]
next_node = []
while True:
for node in current_node:
if node.data:
words.append(node.data)
next_node.extend(list(node.children.values()))
if len(next_node) != 0 :
current_node = next_node
next_node = []
else:
break
return words