Python3의 트라이를 생성하는 두 가지 방법을

트라이는 접두사 나무 또는 트라이 공통 접두어 문자열을 사용하여이 검색 시간을 줄일 수 있습니다. 속도 O (k)는, k는 상기 입력 문자열의 길이이다.

defaultdict를 사용하여 트라이 만들기 (1)

컬렉션 defaultdict를 가져올에서 
functools에서 감소 가져 
defaultdict (TrieNode) : TrieNode = 람다 
클래스 트리는 : 
    데프 __init __ (자기) : 
        self.trie = TrieNode ()는 
    데프 (자동, 단어)를 삽입 : 
        (DICT .__ getitem__, 단어 자체를 줄일 수 있습니다. 트라이) '끝'] = TRUE 
    DEF 됨 (자기, 단어) 
        반환 감소 (람다 D, K : d [K]의 경우 K D를 다른 TrieNode (), 단어 self.trie) 갔지 ( ''말단 거짓)의 
    데프 startsWith (자기 워드) 
        복귀 BOOL은 ((람다 D, K 감소 : d [K]를 K 경우에 다른 TrieNode D (), 단어 self.trie) .keys ())

 2. 사전 구조를 사용

# 트라이 구조를 정의
클래스 TrieNode (객체) : 
    데프 __init __ (자기) : 
        "" " 
        여기 데이터 구조를 초기화합니다. 
        " "" 
        self.data = {} 
        self.is_word이 False = 
 
클래스 트리는 (객체) : 
    데프 __init __ (자기) : 
        self.root = TrieNode () 
 
    데프 (자동, 워드) 삽입 : 
        "" " 
        트라이에 삽입 단어. 
        : 입력 한 단어 : STR 
        : RTYPE : 무효 
        " "" 
        노드 = self.root 
        단어 문자에 : 
            아이 = node.data합니다. (편지) 수 
            :없는 아이의 경우  
                node.data [편지] = TrieNode ()
            노드 = node.data [편지] 
        노드입니다.is_word = TRUE
  
    데프 (자동, 단어를) 검색 : 
        "" " 
        반환 단어가 트라이에있는 경우. 
        : 입력 한 단어 : STR 
        : RTYPE을 : 부울을 
        " "" 
        노드 = self.root 
        단어 편지에 대한 : 
            노드 = node.data.get (편지 쓰기) 
            하지 노드의 경우 : 
                False를 반환 
        반환 node.is_word 번호를判断单词是否是完整的存在在트라이树中
 
    데프하므로 starts_with (자기, 접두사) : 
        "" " 
        어떤 단어에있을 경우 반환 트라이 
        그 주어진 접두사로 시작. 
        : 유형 접두사 : STR 
        : RTYPE : 부울을 
        """ 
        노드 = self.root 
        접두사 문자에 대한 : 
            노드 = node.data.(편지) 얻을 수 
            없는 노드의 경우 :
                False를 반환 
        반환 참 
 
    데프 get_start (자기, 접두사) : 
        "" " 
        접두어로 시작 반환 단어 
        : PARAM 접두사 : 
        : 리턴 : 단어 (목록) 
        " "" 
        데프 _get_key (사전, pre_node) : 
            words_list = [] 
            의 경우 pre_node.is_word : 
                words_list.append는 (프리) 
            pre_node.data.keys ()에 대한 X : 
                words_list.extend (_get_key (프리 + STR (X) pre_node.data.get (X))) 
            복귀 words_list의 
 
        단어 = [] 
        하지 self.starts_with (접두사 경우) :
            단어를 반환 
        하는 경우 self.search (접두사) : 
            words.append (접두사) 
            반환 단어 
        노드 = self.root 
        접두사 문자에 대한 : 
            노드 = node.data.get (편지) 
        반환 _get_key (접두사, 노드)
 

 

추천

출처www.cnblogs.com/137point5/p/12589325.html