前缀树(Tire)—Python

前缀,tire,python · 浏览次数 : 108

小编点评

**核心思想空间换时间**是一种用于快速查询的多叉树结构,利用字符串的公共前缀来降低时间复杂性。 **核心思想:** 1. 使用字符串的公共前缀降低时间复杂性。 2. 使用多个属性(path和end)存储节点信息。 3. 使用动态编程插入和查询方法。 4. 允许插入和查询字符串的末尾。 **主要数据结构:** * **Trie**:使用列表存储节点信息,每个节点对应字符串的一个前缀。 * **Trie**:使用字典存储节点信息,每个节点对应字符串的一个子词。 **核心方法:** **insert():** * 从字符串中获取字符的索引。 * 从当前节点的路径中获取后一个字符的索引。 * 创建一个新的节点,并将其指向当前节点的子节点。 * 更新当前节点的路径和结束标志。 * 返回新的节点。 **startsWith():** * 从字符串中获取字符的索引。 * 从当前节点的路径中获取后一个字符的索引。 * 查找该字符在字典中是否存在对应的节点。 * 如果存在,返回当前节点的路径。 * 否则,返回 None。 **search():** * 从字符串中获取字符的索引。 * 从当前节点的路径中获取后一个字符的索引。 * 查找该字符在字典中是否存在对应的节点。 * 如果存在,从其路径中获取结束标志。 * 否则,返回 None。

正文

核心思想

空间换时间,是一种用于快速查询的多叉树结构,利用字符串的公共前缀来降低时间

优缺点:

优点:查询效率高,减少字符比较

缺点:内存消耗较大

每次都会从头向下一直到字符串结尾

前缀树

1 单个字符串从前到后加到一棵多叉树上

2 每隔字符串都会有自己所在节点的两个属性path和end,path代表经过,end代表这个字符结尾

3 所有的插入操作都是一样的插入方式,有就复用没有就新开辟一条路

4 经过节点path += 1 ;每个字符串结尾 end += 1

5 可以快速查询前缀和完全匹配的数量

画图解释

如图所示 我们插入第一个字符串“abc”,从a开始,没有a就开辟一个a的路把经过的地方都标记path += 1

 

结果相同方式遍历b和c,最后c结果end +=1

 

 

 相同的方式插入ab,每次都会从头开始第一个起始点path += 1,a存在a的path += 1,b也存在b的path +=1 ,b是结尾所以b的end +=1

实现

两种方式实现,第一种会用列表来储存,一种会用字典来储存

实现方式都一样,看会一种即可。

第一种

class Trie:

    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.children = [None] * 26
        self.path = 0
        self.isEnd = 0

    def insert(self, word: str) -> None:
        """
        Inserts a word into the trie.
        """
        node = self
        node.path += 1
        for ch in word:
            offset = ord(ch) - ord('a')
            # node.path += 1
            if not node.children[offset]:
                node.children[offset] = Trie()
            node = node.children[offset]
            node.path += 1

        node.isEnd += 1

    def startsWith(self, prefix: str) :
        node = self
        for ch in prefix:
            offset = ord(ch) - ord('a')
            if not node.children[offset]:
                return None
            node = node.children[offset]

        return node.path

    def search(self, prefix: str) :
        node = self
        for ch in prefix:
            offset = ord(ch) - ord('a')
            if not node.children[offset]:
                return None
            node = node.children[offset]

        return node.isEnd

第二种

class Trie:

    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.children = dict()
        self.path = 0
        self.isEnd = 0

    def insert(self, word: str) -> None:
        """
        Inserts a word into the trie.
        """
        node = self
        node.path += 1
        for ch in word:
            offset = ord(ch) - ord('a')
            if offset not in node.children:
                node.children[offset] = Trie()
            node = node.children[offset]
            node.path += 1

        node.isEnd += 1

    def startsWith(self, prefix: str) :
        node = self
        for ch in prefix:
            offset = ord(ch) - ord('a')
            if offset not in node.children:
                return None
            node = node.children[offset]

        return node.path

    def search(self, prefix: str) :
        node = self
        for ch in prefix:
            offset = ord(ch) - ord('a')
            if offset not in node.children:
                return None
            node = node.children[offset]

        return node.isEnd

与前缀树(Tire)—Python相似的内容:

前缀树(Tire)—Python

核心思想 空间换时间,是一种用于快速查询的多叉树结构,利用字符串的公共前缀来降低时间 优缺点: 优点:查询效率高,减少字符比较 缺点:内存消耗较大 每次都会从头向下一直到字符串结尾 前缀树 1 单个字符串从前到后加到一棵多叉树上 2 每隔字符串都会有自己所在节点的两个属性path和end,path代

Trie字典

Trie树,又叫字典树,前缀树(Prefix Tree),单词查找树,是一种多叉树的结构. {"a","apple","appeal","appear","bee","beef","cat"} 深色表示接受态 关键字集合{"pool", "prize", "prepare", "preview",

【数据结构和算法】Trie树简介及应用详解

Trie树,即字典树,又称单词查找树或键树,是一种树形结构,典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

图解B树及C#实现(1)

前言 B树(B-tree),也常被记作 B-树,其中“-”不发音。B树的发明者 Rudolf Bayer 和 Edward M. McCreight 并没有给B树中的 B 明确的定义,大家也不必对此纠结太多。 B+树是B树的变体,两者的适用场景是不一样的,以后也会给大家带来B+树的介绍。 本系列将用

洛谷官方题单--线段树

前言 发现线段树根本不会写,所以想要完成洛谷官方题单来稍微提升一下... 持续更新ing [ ] P3870 [TJOI2009] 开关 明确了写线段树要思考的几个点 1.如何update,即如何合并子节点的信息,这里就是直接将子节点的灯的数量相加即可 2.如何modify,即如何根据tag修改该节

算法学习笔记(20): AC自动机

# AC自动机 **前置知识**: - 字典树:可以参考我的另一篇文章 [算法学习笔记(15): Trie(字典树)](https://www.cnblogs.com/jeefy/p/17101290.html) - ~~KMP~~:可以参考 [KMP - Ricky2007](https://ww

Vue源码学习(三):渲染第二步,创建ast语法树

好家伙,书接上回 在上一篇Vue源码学习(二):渲染第一步,模板解析中,我们完成了模板解析 现在我们继续,将模板解析的转换为ast语法树 1.前情提要 代码已开源https://github.com/Fattiger4399/analytic-vue.git手动调试一遍, 胜过我

前端回流与重绘:概念及触发条件

在前端开发中,性能优化是一个永恒的话题。回流(Reflow)与重绘(Repaint)是两个重要的概念,它们直接影响着页面的渲染性能和用户体验。本文将详细介绍回流与重绘的概念、触发条件及其优化方法。 一、回流(Reflow)(重排) 1.1 概念 回流,又称重排(Reflow),是指当DOM的变化引起

图解B树及C#实现(2)数据的读取及遍历

前言 本文为系列文章 B树的定义及数据的插入 数据的读取及遍历(本文) 数据的删除 前一篇文章为大家介绍了 B树 的基本概念及其插入算法。本文将基于前一篇的内容,为大家介绍插入到 B树 中的数据该怎么读取及遍历, 本文的代码基于前一篇文章的代码,已经实现的功能可能会被省略,只介绍新增的功能。 在本文

图解B树及C#实现(3)数据的删除

前言 本文为系列文章 B树的定义及数据的插入 数据的读取及遍历 数据的删除 阅读本文前,建议先复习前两篇文章,以便更好的理解本文。 从删除的数据所在的节点可分为两种情况: 从叶子节点删除数据 从非叶子节点删除数据 无论从叶子节点还是非叶子节点删除数据时都需要保证B树的特性:非根节点每个节点的 key