- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于Trie树相似字符串查找算法
基于Trie树相似字符串查找算法 摘 要:基于Trie树的相似字符串查找算法是利用编辑距离的阈值来计算每个节点的活跃节点集,已有算法由于存在大量的冗余计算,导致时间复杂度和空间复杂度都比较高。针对这个问题,采用了基于活跃节点的对称性和动态规划算法的思想对已有算法进行改进,并对活跃节点集进行了修剪,提出了NewTrieStack算法。该算法避免了活跃节点的重复计算,以及已有算法在保存所有已遍历节点的活跃节点集时的空间开销。实验结果表明NewTrieStack算法在时间复杂度和空间复杂度上都有明显的下降。
关键词:Trie树;相似字符串;编辑距离;活跃节点;动态规划
中图分类号: TP391.3
文献标志码:A
0 引言
在许多应用中,相似性连接是一种基本的操作,如DNA分析、拼字检查、语音辨识、抄袭侦测等。而现有的相似性连接算法中通常是利用过滤加验证的框架来处理字符串之间的相似性。过滤阶段:为每一个字符串生成一个标签,利用标签产生候选字符串对;验证阶段:验证候选字符串对,并输出最终结果,如PassJoin、EdJoin、TrieJoin等[1-10]。然而这些算法都存在着一些缺点:
1)不利于处理短字符串的数据集(平均字符串的长度不超过30个字符);2)需要建立大量的字符串索引;3)需要耗费大量成本来支持数据集的动态更新[5]。
为了提高现有算法的性能,本文对文献[5]的TrieJoin算法进行了改进,利用编辑距离的限制并采用动态规划的方式遍历树节点,从而高效地查找出相似字符串。
1 相关概念
1.1 Tire树
Trie树即单词查找树,经常被搜索引擎系统用于文本词频统计。由于很多的字符串都共享相同的字符串前缀,而Trie树的优点就是能最大限度地减少字符串重复前缀的无谓比较。本文所建立的Trie树中,根节点不保存字符,每个节点都有一个索引号唯一标识自己,如图1所示。
1.2 编辑距离
编辑距离是指一个字符串经过有限次编辑操作(插入、删除、修改)变为另一个字符串,设字符串Str1 转换成字符串Str2的编辑距离记为ED(Str1, Str2)。设R为字符串集合,一种简单的查找相似字符串的方法是列出全部字符串对〈r,s〉∈R,逐一计算它们的编辑距离。然而,这种解决办法存在大量的冗余计算。事实上,在大多数情况下,我们不需要计算两个字符串之间完整的编辑距离,利用动态规划算法可以提前终止,参见文献[5]。
2 基于Trie树的相关算法介绍
2.1 TrieNode算法
TrieNode算法采用了Trie树来存储字符串集合,从根节点到某一叶子节点的路径唯一对应一个字符串。前序遍历Trie树节点,利用动态规划的方式把计算字符串之间的编辑距离改成计算节点之间的编辑距离,因为Trie树的每一个节点都对应着一个字符串或字符串的前缀。对于树上的任一节点n,将编辑距离小于阈值τ的节点作为n的活跃节点。通过逐一计算树上节点的活跃节点集来找出全部的相似字符串对。每一个节点的活跃节点集都是利用它的父节点的活跃节点集计算得来的。当遍历到某一叶子节点n时,如果叶子节点m是节点n的活跃节点,那么〈n, m〉就组成了一对相似节点,它们所对应的字符串就是一对相似字符串[5-6,11-12]。
TrieNode算法避免了字符串之间相同前缀的重复计算,大大减少了运行时间。
然而,在计算每一个节点的活跃节点集时,我们发现活跃节点具有着对称性,如果节点n是节点m的活跃节点,那么节点m同样也是节点n的活跃节点,所以TrieNode算法仍然存在很多重复计算。
2.2 TrieDPStack算法
根据活跃节点的对称性,TrieDPStack算法动态地计算每一个节点的活跃节点集,即只与已经遍历过的节点进行编辑距离的计算,并将其加入到与它互为活跃节点的活跃节点集中;同时利用一个栈来存储遍历过的节点和节点的活跃节点集,栈的大小为树的最大深度。
TrieDPStack算法的具体思想是首先将字符串集合构建成一棵Trie树,创建一个栈,前序遍历树中的节点,通过父节点的活跃节点集计算当前遍历节点的活跃节点集,同时修改栈中与它的编辑距离小于阈值的节点的活跃节点集,然后将遍历过的节点及其活跃节点集入栈。如果当前节点没有孩子节点待遍历时,退栈,这样保证了每个节点在进栈前栈顶元素为它的父节点。当遇到叶子节点时,则输出该节点的相似字符串对,退栈,遍历其他节点,直到栈为空,输出所有的相似字符串对。
TrieDPStack算法避免了TrieNode算法中节点之间的重复计算,同时引入栈也避免了保存索引记录时所增加的存储空间开销[5]。然而在计算活跃节点集时,可以根据父节点的活跃节点与
原创力文档


文档评论(0)