Trie简介
Trie即前缀树或字典树,利用字符串公共前缀降低搜索时间。速度为
,
为输入的字符串长度。
上图是一个关于Trie的简单应用示例,其基本思想为:
1) 在插入过程中,对于一个关键词,从根开始,沿着单词的各个字母所对应的树中的节点分支向下走,直到单词遍历完, 将最后的节点标记为红色,表示该单词已插入Trie树。
2)在查询过程中,从根开始按照单词的字母顺序向下遍历Trie树,一旦发现某个节点标记不存在或者单词遍历完成而最后的
节点未标记为红色,则表示该单词不存在,若最后的节点标记为红色,表示该单词存在。
例如要在Trie树中存储A、to、tea、ted、ten、i、in、inn,则可以得到如下图所示结构:
关于Trie的更详细介绍见July的博文。
Python实现
利用Python定义指针
class TrieNode(object):
def __init__(self):
self.child = {}
self.flag = None
利用自定义指针实现Trie
class Trie(object):
def __init__(self):
self.root = TrieNode()
def add(self, words):
curNode = self.root
for word in words:
if curNode.child.get(word) is None:
nextNode = TrieNode()
curNode.child[word] = nextNode
curNode = curNode.child[word]
curNode.flag = 1
def search_exact(self, words):
curNode = self.root
for word in words:
if curNode.child.get(word) is None:
return False
else:
print(word)
curNode = curNode.child[word]
if curNode.flag == 1:
return True
def search_fuzzy(self, sentence):
curNode = self.root
for word in sentence:
if curNode.child.get(word) is None:
return False
else:
print(word)
if curNode.child[word].flag == 1:
return True
else:
curNode = curNode.child[word]
return True
search_exact
为精确匹配,即输入与关键词完全匹配时返回True。例如 words = ‘child’,input = 'child’时返回True,input = ‘children’ 时返回False。
search_fuzzy
为模糊匹配,只要输入中包含关键词就返回True。例如 words = ‘child’,input = ‘child’ 或 ‘children’ 时都返回True。