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);
运行结果: