美文网首页
字典树Trie

字典树Trie

作者: siliconx | 来源:发表于2020-07-13 10:01 被阅读0次

leetcode 208
Trie(发音为 "try") 是一种树数据结构,可以用于快速查找字符串的前缀,有着广泛的应用,如搜索引擎的自动补全、拼写检查等。
Trie最重要的几个方法有:insert(插入单词以构建Trie), search(查找Trie中是否存在某个单词), startsWith(查找Trie中是否存在某个前缀)。

下面是Trie的实现:

class TrieNode(object):
    """Trie节点."""
    def __init__(self, val):
        """初始化."""
        # 节点值,仅用于打印树,无实际用途
        self.val = val

        # 孩子节点,形式为{char: TrieNode}
        self.childs = dict()

        # 该节点是否是某个单词的结尾,用于单词查找
        self.is_end = False

    def __repr__(self):
        """节点的字符串表示,便于观察Trie构建好后的结构."""
        return 'Node(%s)' % self.val


class Trie:
    def __init__(self):
        """初始化."""
        self.root = TrieNode('')

    def insert(self, word: str) -> None:
        """插入单词."""
        p = self.root
        for c in word:
            if c not in p.childs:
                # 建立该字符对应的子节点
                p.childs[c] = TrieNode(c)

            p = p.childs[c]

        # 记录单词的结尾
        p.is_end = True

    def search(self, word: str) -> bool:
        """查找某个单词是否在Trie中."""
        # 从根节点开始
        p = self.root
        for c in word:  # 往下搜索
            if p.childs and c in p.childs:
                p = p.childs[c]
            else:  # 搜索失败
                return False

        return p.is_end

    def startsWith(self, prefix: str) -> bool:
        """查找某个前缀."""
        p = self.root
        for c in prefix:
            if p.childs and c in p.childs:
                p = p.childs[c]
            else:
                return False

        return True

    def show(self):
        """层序遍历Trie."""
        queue = [self.root]
        while queue:
            q_size = len(queue)
            for i in range(q_size):
                p = queue.pop(0)
                print(p, end=' ')
                for cv in p.childs:
                    queue.append(p.childs[cv])
            print()


if __name__ == '__main__':
    trie = Trie()
    trie.insert('app')
    trie.insert('apple')
    trie.insert('apk')
    trie.insert('home')
    trie.show()

    print(trie.search('app'))
    print(trie.search('appl'))
    print(trie.search('apple'))
    print(trie.startsWith('b'))

输出:

Node() 
Node(a) Node(h) 
Node(p) Node(o) 
Node(p) Node(k) Node(m) 
Node(l) Node(e) 
Node(e) 
True
False
True
False

相关文章

  • 数据结构与算法(十一)Trie字典树

    本文主要包括以下内容: Trie字典树的基本概念 Trie字典树的基本操作插入查找前缀查询删除 基于链表的Trie...

  • 【 数据结构 & 算法 】—— 高级数据结构

    思维导图 1/3:trie树(字典树)的基础知识 trie树,又称字典树或前缀树,是一种有序的、用于统计、排序和存...

  • LeetCode 208.实现Trie(字典树) - JavaS

    ?Blog :《LeetCode 208.实现Trie(字典树) - JavaScript》 实现一个 Trie ...

  • 数据结构之Trie字典树

    什么是Trie字典树 Trie 树,也叫“字典树”或“前缀树”。顾名思义,它是一个树形结构。但与二分搜索树、红黑树...

  • trie树

    文章内容来自 Trie树:应用于统计和排序Trie树 trie树又称:字典树、单词查找树、前缀树等,总之是一种树状...

  • 数据结构必知 --- 前缀树

    写在前 什么是字典树?Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。Trie 一...

  • 以太坊详解 之 Merkle Patricia Tree

    基础知识 Trie树 Trie是一种搜索树,又称字典树(digital tree)和前缀树(prefix tree...

  • 树结构之Trie

    1. 什么是trie树 1.Trie树 (特例结构树)Trie树,又称单词查找树、字典树,是一种树形结构,是一种哈...

  • 字典树

    字典树 Trie 在计算机科学中,Trie 又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字...

  • 数据结构——Trie

    一、Trie 字典树 在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是...

网友评论

      本文标题:字典树Trie

      本文链接:https://www.haomeiwen.com/subject/jmzocktx.html