關於Trie樹的原理這裡不做介紹,網上相關的資料非常多,可以參考July的文章:http://blog.csdn.net/v_july_v/article/details/6897097。不過Trie確實是非常的強大,原理不複雜,使用起來也非常的方便。代碼實現其實也不難,如果用C++實現的話需要自己定義資料結構(結構體)來構建樹,這裡我介紹怎樣用Python實現,用Python實現起來尤為的方便,不用自己定義資料結構,用Python的dictionary類型即可。說一句題外話:我發現自從學會用Python以後就愛不釋手,確實是使用起來非常方便。言歸正傳,看看Python實現的簡易Trie樹,為什麼說是簡易呢?因為沒有實現複雜的功能,只是為了說明Trie的基本原理,而且只支援ascii字元。實現了以下幾項準系統:
1、添加單詞:LBTrie的add方法;
2、尋找單詞:LBTrie的search方法;
3、列印Trie樹:LBTrie的output方法。
class LBTrie: """ simple implemention of Trie in Python by authon liubing, which is not perfect but just to illustrate the basis and principle of Trie. """ def __init__(self): self.trie = {} self.size = 0 #添加單詞 def add(self, word): p = self.trie word = word.strip() for c in word: if not c in p: p[c] = {} p = p[c] if word != '': #在單詞末尾處添加索引值''作為標記,即只要某個字元的字典中含有''鍵即為單詞結尾 p[''] = '' #查詢單詞 def search(self, word): p = self.trie word = word.lstrip() for c in word: if not c in p: return False p = p[c] #判斷單詞結束標記'' if '' in p: return True return False #列印Trie樹的介面 def output(self): print '{' self.__print_item(self.trie) print '}' #實現Trie樹列印的私人遞迴函式,indent控制縮排 def __print_item(self, p, indent=0): if p: ind = '' + '\t' * indent for key in p.keys(): label = "'%s' : " % key print ind + label + '{' self.__print_item(p[key], indent+1) print ind + ' '*len(label) + '}' if __name__ == '__main__': trie_obj = LBTrie() #添加單詞 trie_obj.add('hello') trie_obj.add('help') trie_obj.add('world') trie_obj.add('abc') #列印構建的Trie樹 trie_obj.output() #尋找單詞 if trie_obj.search('hello'): print 'Yes' else: print 'No' if trie_obj.search('China'): print 'Yes' else: print 'No'
列印的Trie樹如所示:
尋找輸出結果為:
Yes
No