字典树-Python

字典树

字典树又叫前缀树、单词查找树,树形结构,是哈希树的变种。能够统计、排序和保存大量的字符串,经常被搜索引擎系统用于文本词频统计。优点是利用字符串的公共前缀来减少查询时间,最大程度减少无谓字符串的比较,查询效率高于哈希树。

字典树的原理是这样的,假设我现在有一些字符串["a","ab","abc","abcd"],它们的特点是具有公共前缀,适合使用树形数据结构保存,从根节点到叶子结点的一条路径就能保存所有具有公共前缀的单词。

使用Python实现非常简单,考虑到删除操作涉及较少,暂不实现,简洁版代码如下:

class TreeNode(object):
    def __init__(self):
        self.nodes = {}         # 记录当前结点的子结点
        self.is_leaf = False   # 当前结点是否表示一个单词
        self.count = 0          # 单词树中单词的总量

    def insert(self,word):
        curr = self
        for c in word:
            if not curr.nodes.get(c,None):
                new_node = TreeNode()
                curr.nodes[c] = new_node
            curr = curr.nodes[c]
        curr.is_leaf = True
        self.count += 1
        return

    def insert_many(self,words):
        for word in words:
            self.insert(word)
        return

    def search(self,word):
        curr = self
        try:
            for c in word:
                curr = curr.nodes[c]
        except:
            return False
        return curr.is_leaf
问题实战
分词问题

给定一个字符串s,和一个词典Dict。对字符串s基于词典dict进行分词,存在包含情况的按最长的分词。

输入s=cde ab abc cde gf

dict=["abc" ,"abd","cde","abc cde","abc abd"]

输出s=#cde#  ab  #abc cde#  gf

解决本题要点如下:

  • 将词典构建字典树
  • 遍历字符串,将每个单词插入字典树,并记录满足题目要求的最长单词
  • 在遍历的过程中,如果已经出现前缀缺失,及时剪枝
词典中最长单词

解决本题要点如下:

  • 对字符串数组排序,构建字典树
  • 遍历数组,将每个单词插入字典树,并记录满足题目要求的最长单词
  • 在遍历的过程中,如果已经出现前缀缺失,及时剪枝
单词替换

本题要点如下:

  • 使用字典树保存词根
  • 将 sentence 切割为单词,保存在数组中
  • 遍历数组中的单词,如果访问至叶子结点(is_leaf == True),证明单词具有该词根,将其替换

 


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/347270.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言通过IXMLHTTPRequest以get或post方式发送http请求获取服务器文本或xml数据

做过网页设计的人应该都知道ajax。 Ajax即Asynchronous Javascript And XML(异步的JavaScript和XML)。使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发…

【量化交易】股市舞者:小明的撮合交易之旅

马西森AES撮合交易系统 在繁华的都市中,小明,一个普通的青年,刚刚赚到了人生的第一桶金——20万。这笔意外的财富,点燃了他对股市的强烈兴趣。他开始如饥似渴地学习金融知识,钻研各种交易策略。 一天,小…

现货黄金做日内交易和波段交易有何差异?

在现货黄金投资中,日内交易和波段交易都是投资者常用的手段。但投资者其实搞不懂两者有何区别,有时甚至不清楚自己做的是日内交易还是波段交易,下面我们就来讨论一下这两种交易方法的异同。 两者的区别主要是在持仓的时间上。日内交易顾名思义…

Python算法题集_接雨水

本文为Python算法题集之一的代码示例 题目42:接雨水 说明:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,…

【计算机网络】【练习题】【新加坡南洋理工大学】【Computer Control Network】

说明: 仅供学习使用。 一、题目描述 该题目描述一个网络中传播时延(Transmission Delay)的例子。题目如下: 二、问题解答(个人) 笔者第3问采用均值不等式求解。标答中采用求导数的方法求极值。似乎均值…

el-table 动态渲染多级表头;一级表头根据数据动态生成,二级表头固定

一、表格需求: 实现一个动态表头,一级表头,根据数据动态生成,二级表头固定,每列的数据不一样,难点在于数据的处理。做这种表头需要两组数据,一组数据是实现表头的,另一组数据是内容…

WinSCP如何使用公网TCP地址访问本地服务器

文章目录 1. 简介2. 软件下载安装:3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 ​ Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件,它的主要功能是在本地与远程计…

文件名翻译工具,文件名称翻译软件

无论是工作、学习还是生活,我们时常会遇到文件名称难以理解的情况。这时,一款优秀的文件名称翻译软件就显得尤为重要。今天,我要为大家介绍一个备受好评软件——文件批量改名高手,这款软件自带翻译功能,可以帮你轻松实…

分布式锁实现(mysql,以及redis)以及分布式的概念(续)redsync包使用

道生一,一生二,二生三,三生万物 这张尽量结合上一章进行使用:上一章 这章主要是讲如何通过redis实现分布式锁的 redis实现 这里我用redis去实现: 技术:golang,redis,数据结构 …

2024 年 10 款顶级的数据恢复软件榜单

2024年,随着人工智能、云计算等技术的不断发展,数据已经成为我们生活中不可或缺的一部分。然而,数据丢失的风险仍然存在。删除文件、病毒攻击、硬件损坏和其他情况都可能导致数据丢失。而数据恢复软件就成为解决这一问题的有效方案。 2024 年…

springCloud的ribbon和feign

ribbon方式调用 就是将原来的具体地址,改为了通过服务名去调用。注册中心中有多个服务,相同服务名,就会算作可以调用的服务。 首先得有一个注册中心,然后各种服务注册进去,然后利用ribbon或者feign去调用。 ribbon是直…

微认证 openEuler社区开源贡献实践

文章目录 1. 开源与开源社区2. openEuler 社区概述3.参与openEuler社区贡献4.openEuler软件包开发Linux软件管理——源码编译 1. 开源与开源社区 Richard Matthew Stallman,1983年9月推出GNU项目,并发起自由软件运动(free software movement或free/open…

多维时序 | Matlab实现RIME-TCN-Multihead-Attention霜冰算法优化时间卷积网络结合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现RIME-TCN-Multihead-Attention霜冰算法优化时间卷积网络结合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现RIME-TCN-Multihead-Attention霜冰算法优化时间卷积网络结合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资料…

Dify学习笔记-应用发布(四)

1、发布为公开 Web 站点 使用 Dify 创建 AI 应用的一个好处在于,你可以在几分钟内就发布一个可供用户使用的 Web 应用,该应用将根据你的 Prompt 编排工作。 如果你使用的是自部署的开源版,该应用将运行在你的服务器上 如果你使用的是云服务&…

3.确认弹窗(ConfirmPopup)

愿你出走半生,归来仍是少年! 环境:.NET 7 在开发中,最常用的弹窗之一表示确认弹窗,为了减少重复的开发工作,所以需要基于Popup进行封装。 1.布局 分为标题、确认内容、按钮三个区域,都是可供调整的。 &l…

java复习篇 数据结构:链表第二节 哨兵

目录 单向链表哨兵 初始 头插 思路 代码 尾插 思路 遍历 遍历验证头插 尾插代码 尾插测试 get 思路 代码 测试 insert 思路 代码 测试 remove 移除头结点 提问 移除指定位置 测试 单向链表哨兵 单向链表里面有一个特殊的节点称为哨兵节点,…

MacOS 无法ping 通 github.com 解决方案

ping github.com 会显示请求超时: PING github.com (192.30.253.112): 56 data bytes Request timeout for icmp_seq 0 Request timeout for icmp_seq 1 Request timeout for icmp_seq 2 Request timeout for icmp_seq 3 Request timeout for icmp_seq 4 Request …

一文了解Ceph原理以及常见ceph指令

一、Ceph介绍 什么是分布式存储? 与集中式存储相反,分布式存储通常采用存储单元集群的形式。并且具有在集群节点之间进行数据同步和协调的机制。其目的是为了通过服务器解决大规模,高并发情况下的Web访问问题。 Ceph是一个统一的、分布式的存…

如何利用H5页面引导关注公众号-数灵通

随着流量获取成本的增加,许多企业开始寻找新的引流渠道来储存流量。H5小活动成为了一种有效的引流方式,并且在客户之间传递,形成了裂变效应。企业开始将目光转向H5网站,希望通过引导客户关注公众号来提升品牌影响力。 为了实现这一…

143基于matlab的2D平面桁架有限元分析

基于matlab的2D平面桁架有限元分析,可以改变材料参数,输出平面结构外形,各桁架应力,位移及作用力。可查看节点力,程序已调通,可直接运行。 143 matlab 平面桁架 有限元分析 桁架应力 (xiaohongshu.com)