[数据结构]Trie简介及Python实现

Trie简介及Python实现

Trie简介

Trie即前缀树字典树,利用字符串公共前缀降低搜索时间。速度为 O ( k ) O(k) k k 为输入的字符串长度。
null
上图是一个关于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。
exact search res
search_fuzzy为模糊匹配,只要输入中包含关键词就返回True。例如 words = ‘child’,input = ‘child’ 或 ‘children’ 时都返回True。
fuzzy search

猜你喜欢

转载自blog.csdn.net/Real_Brilliant/article/details/83149844
今日推荐