문자열에서의 검색을 빠르게 해주는 자료구조.
순차탐색이 아닌 트리로 접근하기 위해 만들어진 자료구조
주로 prefix tree, digital search tree, retrieval tree -> Trie
단순 비교
O(nm)
이진 탐색 기법
정렬)
n개의 문자열 정렬 -> O(nlogn)
각 문자열은 최대 m개의 문자 => O(nmlogn)
탐색)
배열의 중간값과 검색 대상 비교 -> 각 단계마다 복잡도 O(logn)
최대 m번의 문자열 비교 -> O(mlogn)
m
일때 탐색과 삽입 모두 O(m)
시간class Trie:
def __init(self):
self.trie = {}
def insert(self, word):
t = self.trie
for c in word:
if c not in t:
t[c] = {}
t =t[c]
t['*'] = True
def search(self, word):
t = self.trie
for c in word:
if c not in t:
return False
t = t[c]
return '*' in t
def startsWith(self, prefix):
t = self.trie
for c in prefix:
if c not in t:
return False
t = t[c]
return True
장점)
특정 접두사를 가진 문자열 검색에 효율적
트라이 -> 키를 사전식으로 정렬된 순서로 저장. 문자별로 트리가 만들어지기 때문에 자동적으로 정렬
사전 순으로 순회하거나 특정 접두어를 가진 모든 키를 찾는 것 용이
완전히 일치하는 문자열이 아니라 일부를 생략하더라도 탐색이 가능함
단점)
대규모 데이터에 대해서는 메모리 소비가 크다.
트라이의 각 노드는 가능한 다음 문자에 대한 포인터를 가지기 때문에 문자열의 길이에 따라 메모리 사용량 증가
트라이는 삽입과 삭제 연산이 비교적 복잡
배열
반면 트리 구조는 참조(포인터)만 변경해주면 된다!
-> 원소의 대량 이동이 필요 없다.
연결 리스트
해쉬 테이블
O(1)
의 시간 복잡도트라이는 해시 테이블보다 공간 효율성이 낮을 수도 있다. 트라이는 문자열을 각각 문자 단위로 분리해서 저장 -> 문자열의 길이가 길면 트라이 깊이가 깊어진다.
참고)
https://butter-shower.tistory.com/217
https://hongjw1938.tistory.com/24
https://velog.io/@joon6093/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%8A%B8%EB%9D%BC%EC%9D%B4C%EC%96%B8%EC%96%B4-%EA%B5%AC%ED%98%84%EB%8B%A8%EA%B3%84