Trie原理、扩展及Python实现

关于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有更高的存储效率。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值