Trie树实现电子词典的自动补齐

代码如下:

def longestCommonPrefix(str1,str2):                #求最长公共子序列
     i = 0;
     while (i < len(str1) and i < len(str2) and (str1[i] == str2[i])):
          i = i + 1;
     return (str1[0:i],str1[i:],str2[i:]);                 #返回str1和str2的相同前缀,str1的后缀,str2的后缀

class Trie:
     def __init__(self,value = None):                                             #Trie树的定义
          self.value = value;
          self.children = dict();

class PatriciaCharTrie(Trie):                     #PatriciaCharTrie的定义,继承Trie
     def __init__(self):                              
          self.root = None;
     def insert(self,key,value):                    #插入函数
          if self.root is None:
               self.root = Trie();
          p = self.root;

          while True:
               match = False;
               for k,node in p.children.items():
                    if key == k:
                         node.value = value;
                         return node;
                    (prefix,remainK,remainKey) = longestCommonPrefix(k,key);
                    #print 'prefix: ',prefix,',key:',key;
                    if prefix != "":                                        #若前缀不为空 
                         match = True;
                         if remainK != "":                              #若k的剩余后缀不为空,
                              if remainKey == "":
                                   p.children[prefix] = Trie(value);
                                   prefixNode = p.children[prefix];
                              else:
                                   p.children[prefix] = Trie();
                                   prefixNode = p.children[prefix];
                                   prefixNode.children[remainKey] = Trie(value);
                              prefixNode.children[remainK] = node;

                              del p.children[k];               
                              return ;
                         else:
                              p = node;
                              key = remainKey;
                              break;
               if not match:
                    p.children[key] = Trie(value);
                    return ;
          return;

     def search(self,searchKey):                #查找searchKey是否在该PatriciaCharTrie中,若是则返回指向该searchKey的节点,否则返回None
          p = self.root;

          while True:
               match = False;
               for key,node in p.children.items():
                    if key == searchKey:
                         return node;
                    else:
                         (prefix,remainKey,remainSearchKey) = longestCommonPrefix(key,searchKey);
                         if prefix != "" and remainKey == "":
                              match = True;
                              p = node;
                              searchKey = remainSearchKey;
                              break;
               if (not match):
                    return None;

     def lookUp(self,searchKey):                           #电子词典的补齐函数
          searchNode = self.search(searchKey);      #找到指向该searchKey的节点
          self.look(searchNode);                          

     def look(self,searchNode):
          if searchNode is not None:
               for key,node in searchNode.children.items():
                    if node.children:                   #若node的children不为空dict,则递归查询searchNode的下一个节点node
                         self.look(node);                       
                         if node.value is not None:       #若node.value不为None,打印该node的值
                              print node.value;
                    else:
                         if node.value is not None:
                              print node.value;
                         else:
                              print 'in else node is None: ';



if __name__ == '__main__':
     trie = PatriciaCharTrie();
     str = ['a','ab','abc','able','abs',
               'baby','back','bad','bag','balance'
               ,'ball','band','between'];
     for i in range(len(str)):
          trie.insert(str[i],str[i]);

     while True:
          word = raw_input('enter a word: ');
          trie.lookUp(word);  

运行结果:

posted @ 2017-04-06 15:43  lxpzh  阅读(164)  评论(0编辑  收藏  举报