1. 程式人生 > >[資料結構]Trie簡介及Python實現

[資料結構]Trie簡介及Python實現

Trie簡介及Python實現

Trie簡介

Trie即字首樹字典樹,利用字串公共字首降低搜尋時間。速度為 O ( k ) O(k) k

k 為輸入的字串長度。
null
上圖是一個關於Trie的簡單應用示例,其基本思想為:
  1) 在插入過程中,對於一個關鍵詞,從根開始,沿著單詞的各個字母所對應的樹中的節點分支向下走,直到單詞遍歷完,   將最後的節點標記為紅色,表示該單詞已插入Trie樹。
  2)在查詢過程中,從根開始按照單詞的字母順序向下遍歷Trie樹,一旦發現某個節點標記不存在或者單詞遍歷完成而最後的
  節點未標記為紅色,則表示該單詞不存在,若最後的節點標記為紅色,表示該單詞存在。

例如要在Trie樹中儲存A、to、tea、ted、ten、i、in、inn,則可以得到如下圖所示結構:
在這裡插入圖片描述

關於Trie的更詳細介紹見July的博文

Python實現

利用Python定義指標

class TrieNode(object):
    def __init__(self):
        self.child = {}
        self.flag = None

利用自定義指標實現Trie

class Trie(object):
    def __init__(self):
        self.root = TrieNode()
                
    def add(self, words):
        curNode = self.root
        for word in words:
            if curNode.child.get(word) is None:
                nextNode = TrieNode()
                curNode.child[word] = nextNode
            curNode = curNode.child[word]
        curNode.flag = 1
        
    def search_exact(self, words):
        curNode = self.root
        for word in words:
            if curNode.child.get(word) is None:
                return False
            else:
                print(word)
                curNode = curNode.child[word]
        if curNode.flag == 1:
            return True
            
    def search_fuzzy(self, sentence):
        curNode = self.root
        for word in sentence:
            if curNode.child.get(word) is None:
                return False
            else:
                print(word)
                if curNode.child[word].flag == 1:
                    return True
                else:
                    curNode = curNode.child[word]
        return True

search_exact為精確匹配,即輸入與關鍵詞完全匹配時返回True。例如 words = ‘child’,input = 'child’時返回True,input = ‘children’ 時返回False。
exact search res
search_fuzzy為模糊匹配,只要輸入中包含關鍵詞就返回True。例如 words = ‘child’,input = ‘child’ 或 ‘children’ 時都返回True。
fuzzy search