关于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
【扩展】
1. Trie树的应用之一:搜索引擎的Suggestion,文章中有介绍:http://blog.csdn.net/stormbjm/article/details/12752317
2. 1中的文章讲了基于Trie树的搜索引擎Suggestion,同时推荐了基于另外一种数据结构的Suggestion:一种基于Trie变种的数据结构——三叉树(Ternary Tree),见文章:http://igoro.com/archive/efficient-auto-complete-with-a-ternary-search-tree/,文章讲到:三叉树比Trie有更高的存储效率。