TRIE

JIN·2023년 9월 8일
0
post-custom-banner

  • 트라이(Trie): 문자열을 저장하고 효율적으로 탐색하기 위한 “트리” 형태의 자료구조
  • 자동 완성기능, 사전 검색 등 문자열을 탐색하는 데 특화되어 있는 자료구조
  • 래딕스 트리(radix tree) or 접두사 트리(prefix tree) or 탐색 트리(retrieval tree) 라고도 한다.

트라이 장단점

  • 트라이는 문자열 검색을 빠르게 한다.
  • 문자열을 탐색할 때, 하나 하나 씩 전부 비교하면서 탐색을 하는 것보다 시간 복잡도 측면에서 훨씬 더 효율적이다.
  • 각 노드에서 자식들에 대한 포인터 들을 배열로 모두 저장하고 있다는 점에서 저장 공간의 크기가 크다는 단점이 있다.(메모리 측면에서 비효율적)

1. 트라이에 문자열 저장

  1. ‘abc’ 트라이에 삽입
    • 첫번 째 문자는 ‘a’이다. 초기에 트라이 구조 내에는 아무것도 없으므로 Head의 자식 노드에 ‘a’를 추가해준다.
    • ‘a’ 노드에도 현재 자식이 하나도 없으므로, ‘a’의 자식 노드에 ‘b’를 추가해준다.
    • ‘c’도 마찬가지로 ‘b’의 자식 노드로 추가해준다.
    • ‘abc’ 단어가 여기서 끝남을 알리기 위해 현재 노드에 abc 라고 표시한다. (Data)

  1. ‘ab’ 트라이에 삽입
    • 현재 Head의 자식 노드로 이미 ‘a’가 존재한다. 따라서 ‘a’노드를 추가하지 않고 기존에 있는 ‘a’노드로 이동한다.
    • ‘b’도 ‘a’의 자식 노드로 이미 존재하므로 ‘b’의 노드로 이동한다.
    • ‘ab’의 단어가 여기서 끝이므로 현재 노드에 ab를 표시한다.

  1. ‘car’ 트라이에 삽입
    • Head의 자식 노드로 ‘a’만 존재하고 ‘c’는 존재하지 않는다. 따라서 ‘c’를 자식노드로 추가한다.
    • ‘c’에 대한 자식 노드가 없으므로 마찬가지로 ‘a’를 추가한다.
    • ‘a’의 자식 노드가 없으므로 마찬가지로 ‘r’을 추가한다.
    • ‘car’단어가 여기서 끝이므로 현재 노드에 ‘car’를 표시한다.

2. 트라이에서 문자열 탐색

  1. 위의 트라이에 ‘abc’문자열이 있는지 탐색해보자.
    • Head의 child에 ‘a’가 존재 → ‘a’노드 (key=’a’)로 이동
    • ‘a’노드의 child에 ‘b’가 존재 —> ‘b’노드(key=’b’)로 이동
    • ‘b’노드의 child에 ‘c’가 존재 —> ‘c’노드로 이동 (key=’c’)
    • 문자열 탐색이 완료됨 —> 현재 노드에 데이터 값이 존재 —> 문자열 존재
  2. ‘ca’ 라는 문자열이 있는지 탐색해보자
    • Head의 child에 ‘c’가 존재 —> ‘c’노드(key=’c’)로 이동
    • ‘c’노드의 child에 ‘a’가 존재 —> ‘a’노드(key=’a’)로 이동
    • 문자열 탐색이 완료됨 —> 현재 노드에 데이터 값이 없음 —> 문자열 존재 안함

구현

class Node(object):
	def __init__(self, key, data=None):
		self.key = key
		self.data = data
		self.children = {}

class Trie(object):
	def __init__(self):
		self.head = Node(None)

	def insert(self, string):
		
		curr_node = self.head

		for char in string:
			if char not in curr_node.children:
				curr_node.children[char] = Node(char)
				curr_node = curr_node.children[char]
				
		curr_node.data = string

	def search(self, string):
		
		curr_node = self.head

		for char in string:

			if char in curr_node.children:
				curr_node = curr_node.children[char]

			else:
				return False

		if curr_node.data is not None:
			return True

ref. https://www.geeksforgeeks.org/trie-insert-and-search/

https://velog.io/@kimdukbae/자료구조-트라이-Trie

https://youseop.github.io/2020-11-09-BAEKJOON-14425_문자열집합/

profile
배우고 적용하고 개선하기
post-custom-banner

0개의 댓글