算法题目二:寻找最长重复子序列(2) trie树与后缀树的应用

蓝桥杯:最长相同子序列(LCS)问题 记忆搜索解法 蓝桥杯:最长相同子序列(LCS)问题 记忆搜索解法 相比递归法的375ms,速度优化的非常快了 问题描述   设x(i), y(i), z(i)表示单个字符,则X={x(1)x(2)……x(m)},Y={y(1)y(2)……y(n)},Z={z(1)z(2)……z(k)},我们称其为字符序列,其中m,n和k分别是字符序列X,Y,Z的长度,括号()中的数字被称作字符序列的下标。   如果存在一个严... 阅读详情

本文是转载!原博客地址为:http://www.cnblogs.com/aiyelinglong/archive/2012/04/09/2439777.html

仅作为个人算法学习的记录之用,不用做任何其他用途。

 

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

trie树的应用:

1.有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。

2.1000万字符串,其中有些是重复的,需要把重复的全部去掉,保留没有重复的字符串。请怎么设计和实现?

3.一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析。

4.寻找热门查询:搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前有一千万个记录,这些查询串的重复读比较高,虽然总数是1千万,但是如果去除重复和,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就越热门。请你统计最热门的10个查询串,要求使用的内存不能超过1G。

后缀树的应用:

1.查找字符串O是否在字符串S中。

方案:用S构造后缀树,按在trie中搜索字串的方法搜索O即可。

原理:若O在S中,则O必然是S的某个后缀的前缀。

例如:leconte,查找O:con是否在S中,则O(con)必然是S(leconte)的前缀。

2.指定字符串T在字符串S中的重复次数。

方案:用S+’$’构造后缀树,搜索T节点下的叶子节点数目即为重复次数

原理:如果T在S中重复了两次,则S应有两个后缀以T为前缀,重复次数自然统计出来了。

3.字符串S中的最长重复子串

方案:原理同2,具体做法是找到最深的非叶子节点。

这个深指从root所经历过的字符个数,最深非叶子节点所经历的字符串起来就是最长重复子串。为什么非要是叶子节点呢?因为既然是要重复的,当然叶子节点个数要>=2

4.两个字符串S1,S2的最长公共子串(而非以前所说的最长公共子序列,因为子序列是不连续的,而子串是连续的。)

方案:将S1#S2$作为字符串压入后缀树,找到最深的非叶子节点,且该节点的叶子节点既有#也有$.

5.最长回文子串

后缀树应用之寻找重复出现过的最长子串 后缀树应用之寻找重复出现过的最长子串 给定一个字符串s,假设该字符串内只包含数字和字母,试找出其重复出现的最长子串。 Sample Input: strstr thisisastringwhichisisis Sample Output: str isis 《编程珠玑》最后一章有提到这个例子,书中使用了后缀树这一技巧。后缀树其实可以看作一个由字符串s倒 阅读详情

相关推荐

【数据结构】后缀树与前缀树的区别与联系

本文旨在帮助读者理解两种重要字符串数据结构:前缀树(Trie)和后缀树(Suffix Tree)的核心区别。我们将从基础原理出发,通过生活案例和代码实现,深入探讨它们的应用场景及内在联系。核心概念:通过乐高积木模型理解数据结构本质原理对比:可视化流程图展示结构差异实战代码:Python实现自动补全和基因序列分析应用场景:从搜索引擎到COVID病毒变异追踪前缀树(Trie):以单词前缀为构建单位的树形结构后缀树(Suffix Tree):包含字符串所有后缀的压缩树结构模式匹配。

AI 算法实战派 1131

算法题目二:寻找最长重复子序列(3) 后缀树

本文为转载,有所修改。原作者文章为:http://hi.baidu.com/zealot886/item/5d35b442d059701a886d1072(百度空间) 仅为个人学习备份之用途,无任何其他用途!   写这篇文章,主要是因为最近有个课题设计,里面用的字符串匹配。 学习后缀树之前,先了解一下Trie这个数据结构 Trie是一种搜索树,可用于存储并查找字符串。

1ouis的专栏 1978

实用算法实现-第8篇 后缀树和后缀数组 [1简介]

8.1    后缀树 一棵后缀树包含一个指定文本的所有后缀,对于在一个长度为N的文本中查找一个长度为M的子字符串,一个后缀树仅仅需要M次比较,而这个比较次数是查找该字符串所需要的最小比较次数。 后缀树有以下特征:一条边可以表示文本的任何非空子串,每个非终端节点,除了根节点,必须至少有两个孩子边,兄弟边表示的子串必须开始于不同的字符。 ababa所对应的后缀树如下所示: 后缀树可以解

李希的博客 4554

trie树和后缀树的应用

Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。 trie树的应用: 1.有一个1G大小的一个文件,里面每一...

weixin_30216561的博客 175

随机化策略——随机变量rand、约束constraint、权重dist、随机数产生示例

文章目录一、随机变量类型1.1.rand随机变量1.2.randc随机变量二、随机化约束2.1.constraint指定约束范围2.1.1.关系操作符约束(>、<、=、>=、<=)2.1.2.范围操作符约束(inside)2.1.3.权重分布约束(dist)2.1.4.条件约束(if-else; ->)三、启动随机化——randomize( )函数四、关闭或打开随机变...

Mr.翟的博客 2万+

vivado 编译ADI AD9361 TCL脚本生成hdl工程

(4)输入"source ../../scripts/adi_make.tcl"命令(仅双引号内部命令,不包含双引号),个人理解:该命令用来加载当前所需要编译工程所需要各功能模块的信息,因为每个工程需要不同的功能模块,比如有的需要gpio模块,有的不需要gpio模块,这些模块上前面路径的library也同样以TCL脚本形式存在,当有需要时才进行编译,怎么知道当前工程需要什么模块呢就是通过"source ../../scripts/adi_make.tcl"(仅双引号内部命令,不包含双引号)命令实现。

weixin_40586423的博客 808

python字符串查找重复项_查找字符串中最长的重复序列 - python

我需要在字符串中找到最长的序列,但要注意,该序列必须重复三次或更多次。因此,例如,如果我的字符串是:fdwaw4helloworldvcdv1c3xcv3xcz1sda21f2sd1ahelloworldgafgfa4564534321fadghelloworld那么我想返回值“helloworld”。我知道完成此操作的几种方法,但是我面临的问题是实际的字符串非常大,因此我确实在寻找一种可以及时实...

weixin_39541844的博客 1381

DDPG算法实战:用Python一步步实现深度强化学习中的连续动作控制

本文详细介绍了DDPG算法在深度强化学习中的连续动作控制应用,通过Python和PyTorch实现从零构建智能体。内容涵盖环境搭建、网络架构设计、经验回放、OU噪声实现及训练流程优化,帮助开发者掌握DDPG在机械臂控制等场景的核心技术。

weixin_30335575的博客 416

数据结构与算法 - 后缀树的入门:字符串匹配的高效结构

摘要 本文深入浅出地介绍了字符串处理中的高效数据结构——后缀树。文章首先通过朴素算法与KMP等算法的对比,指出后缀树在多次查询时的优势(预处理O(n),查询O(m))。随后详细讲解后缀树的定义、构建步骤(从标准Trie到压缩Trie)和核心性质,包括边标签不相交、叶子数与字符串长度相等等特性。文中还列举了后缀树能解决的典型问题,如子串查询、最长重复子串等,并简要介绍了Ukkonen线性时间构建算法。最后提供了一个基于显式插入的简化版Java实现,包含节点设计和基础构建方法。通过清晰的图示和代码示例,帮助读者

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

FDTD仿真进阶:液晶偏振调控与双折射效应全解析

本文深入解析了在Lumerical FDTD仿真中如何对液晶材料进行偏振调控与双折射效应建模。通过单轴液晶和螺旋扭曲液晶(TN-LCD)两大实战案例,详细阐述了从各向异性材料参数设置、LC网格属性配置到偏振椭圆分析的全流程,帮助工程师精准模拟液晶的光开关行为,优化如显示器等器件的光学性能。

chair的专栏 745

告别Inspect!用微软官方推荐的Accessibility Insights搞定WinApp自动化测试元素定位

本文介绍了如何从传统的Inspect工具升级到微软官方推荐的Accessibility Insights for Windows,以提升Windows应用自动化测试中的元素定位效率。通过详细的功能对比、安装指南和实战技巧,帮助测试工程师掌握这款现代化工具的核心优势,包括实时元素检测、属性筛选和与WinAppDriver、Appium等测试框架的无缝集成。

weixin_26749245的博客 622

从Trie树(字典树)谈到后缀树(10.28修订)

从Trie树(字典树)谈到后缀树作者:July、yansha。出处:http://blog.youkuaiyun.com/v_JULY_v 。 引言    常关注本blog的读者朋友想必看过此篇文章:从B树、B+树、B*树谈到R 树,这次,咱们来讲另外两种树:Tire树与后缀树。不过,在此之前,先来看两个问题。    第一个问题: 一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,

结构之法 算法之道 17万+

Office如何通过VSTO进行WORD插件开发?

VSTO(Visual Studio Tools for Office )是VBA的替代,是一套用于创建自定义Office应用程序的Visual Studio工具包。VSTO可以用Visual Basic 或者Visual C#扩展Office应用程序(例如Word、Excel、PPT)。本文通过VSTO进行Word插件开发总结,并进行记录。

【cacrle】的博客 7320

前缀树和后缀树

今天主要看的是树中的两个比较重要的数据结构——前缀树和后缀树。在此之前,先来看两个问题。(参考博客:从Trie树(字典树)谈到后缀树)

xy的博客 1万+

mysql 学习笔记(1):mysql 基本概念和 mysql workbench 的基本使用方法

…

qq_52740163的博客 1355

MATLAB算法实战应用案例精讲-【数模应用】装箱问题

装箱问题可以根据不同的维度进行分类。以下是一些常见的装箱问题二维装箱问题:二维装箱问题假设所有物品都是平面上的矩形,并且需要将它们放入平面上的容器中。这个问题的目标是找到一种装箱方案,使得物品不重叠并占据的总面积最小。三维装箱问题:三维装箱问题考虑到物品可以具有高度,并且需要将它们放入三维容器(如箱子或货柜)中。目标是找到一种装箱方案,使得物品不重叠且总体积最小。多维装箱问题:多维装箱问题是指在更高维度空间中进行装箱的问题。除了长度和宽度之外,物品可能具有其他属性,如高度、重量、形状等。

qq_36130719的博客 1572

从Trie树(字典树)谈到后缀树

作者:July、yansha。 出处:http://blog.youkuaiyun.com/v_JULY_v 。  引言     常关注本blog的读者朋友想必看过此篇文章:从B树、B+树、B*树谈到R 树,这次,咱们来讲另外两种树:Tire树与后缀树。不过,在此之前,先来看两个问题。     第一个问题: 一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,

1474

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

树:后缀树

在 trie 数据结构中,给定字符串中所有字符串的每个字母表一个接一个地遍历,每个节点代表一个字母表。如果两个或多个单词以相同的子字符串开头,则相同的子字符串由相同的节点链表示。这是一个压缩的 trie,包括字符串的所有后缀。个后缀中的每一个节点一个,没有后缀是另一个后缀的前缀。下面是我们之前用于进行 try 的相同朋友名称列表的后缀树的表示。后缀树的空间使用量远远大于序列集合的实际大小,无论它是线性的。无论哪种方式,都已经发表了开发基于磁盘的后缀树的实际工作,这些后缀树可以扩展到(几)GB/小时。

新华编程特战队 1215

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

前缀树,后缀树,后缀数组 | 详解

前缀树是一种树形结构,用于存储字符串集合,以便进行快速检索、插入和删除操作。树中的每个节点代表字符串中的一个字符,从根节点到某个节点的路径上的字符连接起来,就是该节点所表示的字符串。

m0_56653160的博客 1390

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

算法分析与设计(后缀树)

一、后缀树的定义:通过一个树可以表示所有可能的后缀子串; 例子:S=acacag; 1)每一条边用一个字符串标记;2)所有的后缀可以从根结点到所有叶结点的路径读出; 3)结束标记符“$”(避免某些后缀是其他后缀的前驱); 后缀树的特点:1)长度为n的字符串,其后缀树恰好有n个叶子结点(因为有n个后缀); 2)每一条边可以用个数据表示(在原来字符串的起始位置和结束位置); 3)在一个...

)梦想之深邃( 994

算:从Trie树(字典树)谈到后缀树(10.28修订)

从Trie树(字典树)谈到后缀树(10.28修订) 2011年10月22日 20:34:29 v_JULY_v 阅读数:155105 https://blog.youkuaiyun.com/v_july_v/article/details/6897097 从Trie树(字典树)谈到后缀树 说明:本文基本上是“整理”性质,致谢文末的参考文献。 引言 ...

hunter 310

最长重复子序列问题的后缀数组解法

最长重复子序列问题除了使用穷举法,还可以使用后缀数组和后缀树来求解。这里给出使用后缀数组解决的最长重复子序列的过程,并以“banana”为例进行演示。首先写下一个比较两个字符串从头开始共同部分的长度的函数: int comlen(char *p, char *q) { int i = 0; while(*p&&(*p++ == *q++)) i++; re

ryan_jianjian的博客 1273

字典树(Trie树)

引言 常关注本blog的读者朋友想必看过此篇文章:从B树、B+树、B*树谈到R 树,这次,咱们来讲另外两种树:Tire树与后缀树。不过,在此之前,先来看两个问题。 第一个问题: 一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析。之前在此文:海量数据处理面试题集锦与Bit-map详解中给出的参考答案:用trie树统计每个词出现的次数,时...

qq_42024195的博客 716
上一篇: 算法题目二:寻找最长重复子序列(1) trie树
下一篇: 算法题目二:寻找最长重复子序列(3) 后缀树
louis9212
博客等级 码龄14年 8粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值