前缀树(Tire)—Python
核心思想
空间换时间,是一种用于快速减速的多叉树结构,利用字符串的公共前缀来降低时间
优缺点:
优点:查询效率高,减少字符比较
缺点:内存消耗较大
每次都会从头向下一直到字符串结尾
前缀树
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的更多相关文章
- python利用Trie(前缀树)实现搜索引擎中关键字输入提示(学习Hash Trie和Double-array Trie)
python利用Trie(前缀树)实现搜索引擎中关键字输入提示(学习Hash Trie和Double-array Trie) 主要包括两部分内容:(1)利用python中的dict实现Trie:(2) ...
- 支持中文的基于词为基本粒度的前缀树(prefix trie)python实现
Trie树,也叫字典树.前缀树.可用于"predictive text"和"autocompletion".亦可用于统计词频(边插入Trie树边更新或加入词频) ...
- 【python】Leetcode每日一题-前缀树(Trie)
[python]Leetcode每日一题-前缀树(Trie) [题目描述] Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的 ...
- 【Todo】字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树
另开一文分析字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树. 先来一个汇总, 算法: 本文中提到的字符串匹配算法有:KMP, BM, Horspool, Sunday, BF, ...
- Trie(前缀树/字典树)及其应用
Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,PATRICIA tree,以及bitwise版本的crit-bit tree.当然很多名字的意义其实有交 ...
- trie树(前缀树)详解——PHP代码实现
trie树常用于搜索提示.如当输入一个网址,可以自动搜索出可能的选择.当没有完全匹配的搜索结果,可以返回前缀最相似的可能. 一.Tire树的基本性质 根节点不包含字符,除根节点外每一个节点都只包含一个 ...
- 4.14——208. 实现 Trie (前缀树)
前缀树(字典树)是经典的数据结构,以下图所示: 本来处理每个节点的子节点集合需要用到set,但是因为输入规定了只有26个小写字母,可以直接用一个[26]的数组来存储. 关于ASCII代码: Java ...
- 【LeetCode】208. Implement Trie (Prefix Tree) 实现 Trie (前缀树)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:Leetcode, 力扣,Trie, 前缀树,字典树,20 ...
- HDU1671——前缀树的一点感触
题目http://acm.hdu.edu.cn/showproblem.php?pid=1671 题目本身不难,一棵前缀树OK,但是前两次提交都没有成功. 第一次Memory Limit Exceed ...
- [LeetCode] Implement Trie (Prefix Tree) 实现字典树(前缀树)
Implement a trie with insert, search, and startsWith methods. Note:You may assume that all inputs ar ...
随机推荐
- prettierrc格式化常用配置
#最大长度 printWidth: 140 #单引号 singleQuote: true tabWidth: 2 useTabs: false # 句尾添加分号 semi: false # js an ...
- 市面上erp软件那么多,为什么很多卖家选择定制erp?
为什么选择定制ERP?适合自己的才是最好的啊!就连头部ERP企业提供给用户的ERP系统,应该也没有不进行个性化定制的吧,匹配很重要!规模不同.行业不同.发展阶段不同.生产模式不同.管理理念不同,适用的 ...
- MES会成为象ERP一样的标准产品吗?
首先ERP不是完全的标准产品,只是标准化程度高低的问题,即使是头部ERP品牌产品也一样,包括SAP对每个企业都有客制,并且随着企业的成长变化也会跟着变,所以SAP就有"Rise With S ...
- 轻量级Web框架Flask——Web表单
安装 Flask-WTF及其依赖可使用pip安装 pip install flask_wtf 配置 要求应用配置一个密钥.密钥是一个由随机字符构成的唯一字符串,通过加密或签名以不同的方式提升应用的安全 ...
- H5与APP的交互框架(WebViewJavascriptBridge)
基本原理是: 把 OC 的方法注册到桥梁中,让 JS 去调用. 把 JS 的方法注册在桥梁中,让 OC 去调用.(注册自己,调用它人.) WebViewJavaScriptBridge 使用的基本步骤 ...
- 【MySQL】01_运算符、函数
运算符 运算符是保留字或主要用于 SQL 语句的 WHERE 子句 中的字符,用于执行操作,例如:比较和算术运算. 这些运算符用于指定 SQL 语句中的条件,并用作语句中多个条件的连词. 常见运算符有 ...
- 九、Django3的ASGI
九.Django3的ASGI 9.1.Web应用程序和web服务器 Web应用程序(Web)是一种能完成web业务逻辑,能让用户基于web浏览器访问的应用程序,它可以是一个实现http请求和响应功能的 ...
- mybatis-特殊查询
特殊SQL的执行 模糊查询 /** * 根据用户名进行模糊查询 * @param username * @return java.util.List<com.atguigu.mybatis.po ...
- 所有selenium相关的库
通过爬虫 获取 官方文档库 如果想获取 相应的库 修改对应配置即可 代码如下 from urllib.parse import urljoin import requests from lxml im ...
- ARM TrustZone白皮书部分阅读
嵌入式系统安全的一些解决方法及缺陷 外部硬件安全模块:在主SoC之外包含一个专用的硬件安全模块或可信元件,e.g. 手机的SIM卡.隔离仅限于可以从非易失性存储器运行的相对静态程序 内部硬件安全模块: ...