본문 바로가기

CS/알고리즘

[알고리즘] Trie

반응형

Trie 란 ?

문자열을 저장하고 효율적으로 탐색하기 위한 트리 형태의 자료구조

radix tree 혹은 prefix tree라고도 함

 

 

위와 같은 구조로 조회 시 문자열의 길이만큼의 시간 복잡도를 가진다

검색어 자동완성, 사전에서 찾기, 문자열 검사 등으로 활용된다

O(m) m:문자열 길이

 


Trie 구현 소스

 

class Node:
    def __init__(self, key):
        self.key = key
        self.child = dict()
        self.count = 0


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

    def insert(self, word):
        cur = self.head  # 루트를 현재 포인터로 설정

        for ch in word:
            cur.count += 1  # 한 단어 추가될 것이므로 카운트 + 1

            # 만약 ch가 없다면
            if ch not in cur.child:
                cur.child[ch] = Node(ch)  # ch를 key로 갖는 자식 Node 생성
            cur = cur.child[ch]  # 자식 노드로 현재 포인터 이동

        cur.count += 1  # 마지막 노드 카운트 + 1

        # 단어의 끝을 * 로 출력
        if '*' not in cur.child:
            cur.child['*'] = Node('*')

    def searchPrefix(self, word):
        cur = self.head  # 루트를 현재 포인터로 설정

        for ch in word:
            # 만약 ch가 없다면
            if ch not in cur.child:
                return 0
            cur = cur.child[ch]  # 자식 노드로 현재 포인터 이동

        if cur.count > 1:
            return True
        else:
            return False

    def search(self, word):
        cur = self.head  # 루트를 현재 포인터로 설정

        for ch in word:
            # 만약 ch가 없다면
            if ch not in cur.child:
                return False
            cur = cur.child[ch]  # 자식 노드로 현재 포인터 이동

        # 단어의 끝인 * 가 없다면, 없는 단어임 
        if "*" not in cur.child:
            return False
        else:
            return True
반응형

'CS > 알고리즘' 카테고리의 다른 글

[알고리즘] Insertion Sort  (0) 2021.09.25
[알고리즘] Selection Sort  (0) 2021.09.25
[알고리즘] Bubble Sort  (0) 2021.09.25
[알고리즘] Floyd Warshall Algorithm  (0) 2021.07.19
[알고리즘] Dijkstra's Algorithm  (0) 2021.07.17