[資料結構]Trie簡介及Python實現
阿新 • • 發佈:2018-11-09
Trie簡介及Python實現
Trie簡介
Trie即字首樹或字典樹,利用字串公共字首降低搜尋時間。速度為
,
為輸入的字串長度。
上圖是一個關於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。
search_fuzzy
為模糊匹配,只要輸入中包含關鍵詞就返回True。例如 words = ‘child’,input = ‘child’ 或 ‘children’ 時都返回True。