核心思想

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

优缺点:

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

缺点:内存消耗较大

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

前缀树

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的更多相关文章

  1. python利用Trie(前缀树)实现搜索引擎中关键字输入提示(学习Hash Trie和Double-array Trie)

    python利用Trie(前缀树)实现搜索引擎中关键字输入提示(学习Hash Trie和Double-array Trie) 主要包括两部分内容:(1)利用python中的dict实现Trie:(2) ...

  2. 支持中文的基于词为基本粒度的前缀树(prefix trie)python实现

    Trie树,也叫字典树.前缀树.可用于"predictive text"和"autocompletion".亦可用于统计词频(边插入Trie树边更新或加入词频) ...

  3. 【python】Leetcode每日一题-前缀树(Trie)

    [python]Leetcode每日一题-前缀树(Trie) [题目描述] Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的 ...

  4. 【Todo】字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树

    另开一文分析字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树. 先来一个汇总, 算法: 本文中提到的字符串匹配算法有:KMP, BM, Horspool, Sunday, BF, ...

  5. Trie(前缀树/字典树)及其应用

    Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,PATRICIA tree,以及bitwise版本的crit-bit tree.当然很多名字的意义其实有交 ...

  6. trie树(前缀树)详解——PHP代码实现

    trie树常用于搜索提示.如当输入一个网址,可以自动搜索出可能的选择.当没有完全匹配的搜索结果,可以返回前缀最相似的可能. 一.Tire树的基本性质 根节点不包含字符,除根节点外每一个节点都只包含一个 ...

  7. 4.14——208. 实现 Trie (前缀树)

    前缀树(字典树)是经典的数据结构,以下图所示: 本来处理每个节点的子节点集合需要用到set,但是因为输入规定了只有26个小写字母,可以直接用一个[26]的数组来存储. 关于ASCII代码: Java ...

  8. 【LeetCode】208. Implement Trie (Prefix Tree) 实现 Trie (前缀树)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:Leetcode, 力扣,Trie, 前缀树,字典树,20 ...

  9. HDU1671——前缀树的一点感触

    题目http://acm.hdu.edu.cn/showproblem.php?pid=1671 题目本身不难,一棵前缀树OK,但是前两次提交都没有成功. 第一次Memory Limit Exceed ...

  10. [LeetCode] Implement Trie (Prefix Tree) 实现字典树(前缀树)

    Implement a trie with insert, search, and startsWith methods. Note:You may assume that all inputs ar ...

随机推荐

  1. 51单片机下实现软件模拟IIC通信

    1.IIC协议简易概述 IIC全称Inter-Integrated Circuit (集成电路总线),是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备.IIC属于半双 ...

  2. Mybatis PageHelper 使用的注意事项

    什么时候会导致不安全的分页? PageHelper 方法使用了静态的 ThreadLocal 参数,分页参数和线程是绑定的. 只要你可以保证在 PageHelper 方法调用后紧跟 MyBatis 查 ...

  3. 如何编写 Pipeline 脚本

    前言 Pipeline 编写较为麻烦,为此,DataKit 中内置了简单的调试工具,用以辅助大家来编写 Pipeline 脚本. 调试 grok 和 pipeline 指定 pipeline 脚本名称 ...

  4. iptables基本使用举例

    一.链的基本操作 1.清除所有的规则. 1)清除预设表filter中所有规则链中的规则. # iptables -F 2)清除预设表filter中使用者自定链中的规则. #iptables -X #i ...

  5. 面向对象day02,作业学生类,电脑类

    学生类,电脑类,测试类 学生类:解释都写在注释里面 public class Student { public String name; public int id; public char gend ...

  6. 我用EasyExcel优化了公司的导出(附踩坑记录)

    背景介绍 最近要改一个导出的功能,在原有的基础上,在导出一份明细数据,要求导出内容加在原有 excel 的第二个 sheet 上.考虑到数据量还比较大,干脆引入阿里的 EasyExcel 来做. 下面 ...

  7. perl哈希嵌套和引用的使用

    数组,哈希嵌套 数组,哈希的引用 1.哈希的嵌套和引用 %hash = ( 'group1', {'fruit', 'banana', 'drink', 'orange juice', 'vegeta ...

  8. Go实现常用软件设计模式一:单例模式

    目录: 举个栗子 概念介绍 使用场景 1.举个栗子 类图 plantuml ``` @startuml'https://plantuml.com/class-diagramclass Elephant ...

  9. uwsgi 启动配置文件

    # uwsig使用配置文件启动 [uwsgi] # 项目目录 chdir=/myfiles/xxx/xxx/my_project # 指定项目的application module=my_projec ...

  10. 让 Serverless 更普惠,阿里云函数计算 FC 宣布全面降价,最大幅度达 37.5%

    11月5日,2022 杭州 · 云栖大会上,阿里云宣布函数计算 FC 开启全面降价,vCPU 单价降幅** 11%,其他的各个独立计费项最高降幅达 37.5%**. 本次云栖大会上,阿里云智能总裁张建 ...