-
트라이(TRIE)Data Structure & Algorithm 2021. 9. 7. 16:27반응형
[Trie란]
Trie(retrieval: 검색)는 검색 트리의 일종으로 일반적으로 문자열의 각 문자를 키로 하여 순차적으로 문자열의 구성 정보를 저장하는 데 사용한다. 주로 검색어 자동완성, 사전 찾기, 문자열 검사 등에 사용된다.
[Trie의 시간복잡도]
- insert: 문자열 개수를 N라 하고 가장 긴 문자열의 길이를 L이라 할 때 Trie에 모든 데이터를 삽입하는 작업의 시간 복잡도는 O(N * L)이다.
- search: 찾고자 하는 문자열의 길이가 L이라고 할 때 해당 문자열의 유무를 확인하는 시간 복잡도는 O(L)이다.
[Trie의 구현]
from collections import defaultdict class TrieNode: def __init__(self): self.word = '' # defaultdict() 기능 확인. self.children = defaultdict(TrieNode) class Trie: def __init__(self): self.root = TrieNode() def insert(self, string: str) -> None: node = self.root for char in string: node = node.children[char] node.word = string def search(self, string: str) -> bool: node = self.root for char in string: if char not in node.children: return False node = node.children[char] return True if node.word else False def starts_with(self, prefix: str) -> bool: node = self.root for char in prefix: if char not in node.children: return False node = node.children[char] return True def auto_complete(self, prefix: str) -> list: node = self.root candidates = [] for char in prefix: if char not in node.children: return candidates node = node.children[char] if node.word: candidates.append(prefix) stack = list(node.children.values()) while stack: v = stack.pop() if v.word: candidates.append(v.word) stack.extend(list(v.children.values())) return candidates my_trie = Trie() my_trie.insert('sarang') my_trie.insert('saram') my_trie.insert('satang') my_trie.insert('sara') print(my_trie.search('sa')) # 일치하는 문자열이 없으므로 False print(my_trie.search('sarang')) # 일치하는 문자열이 존재하여 True print(my_trie.starts_with('ta')) # 'ta'로 시작하는 문자열이 없으므로 False print(my_trie.starts_with('sa')) # 'sa'로 시작하는 문자열이 존재하므로 True print(my_trie.auto_complete('')) # 아무 것도 입력되지 않으면 모든 문자열을 보여줌. print(my_trie.auto_complete('sar')) # 입력 문자열이 'sar'이면 sar로 시작하는 문자열들을 보여 줌.
위 코드르 실행한 결과는 다음과 같다.
False True False True ['satang', 'sara', 'saram', 'sarang'] ['sara', 'saram', 'sarang']
'Data Structure & Algorithm' 카테고리의 다른 글
슬라이딩 윈도우 (sliding window) (1) 2021.09.09 빠른 구간 합 구하기(누적 합) (0) 2021.09.08 투 포인터(Two Pointers) (0) 2021.09.07 파라메트릭 탐색(Parametric search) (0) 2021.09.06 [프로그래머스] 프린터 (0) 2021.09.05