- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我遇到了一个问题,它需要一个数据结构来保存字符串 S 并允许我:
我发现 suffix trees由 Ukkonen 算法构造的是我正在寻找的。算法描述为 "On-line construction of suffix trees" ,我对“在线”部分有疑问:在插入每个字符算法后构造一个隐式后缀树,可以在最后一步将其转换为显式。但是,如果我想在该步骤之前使用隐式树进行搜索怎么办? “在线”表明在插入分析字符串的任何前缀之后是可能的,但我找不到任何在隐式树上运行的最简单算法的例子。
我的问题是:如何在隐式 后缀树中搜索字符串?
编辑:我接受了一个很好的答案来解决我的问题,但与此同时我设法找到了一个更简单的解决方案 2:在长度为 |U| 的 S 后缀中搜索 U 就足够了使用KMP算法,最后匹配到的字符数为字符串重叠。
最佳答案
隐式后缀树和显式后缀树只有一个区别:它不包含字符串结束标记(并且不包含与这些字符串结束标记对应的任何分支)。
这意味着在何处搜索子字符串没有区别 - 在隐式后缀树中还是在显式后缀树中。由于隐式后缀树包含更少的不必要分支,这保证了更有效(但仍然是线性时间)的子字符串搜索算法。
因此自动满足要求 #1:只需从根搜索后缀树并选择与给定单词匹配的分支。
至于要求 #2,我认为,您无法使用相同的隐式后缀树来满足它。因为您需要字符串结尾标记来处理后缀。
但是您可以在 O(|U|)
时间内为给定的单词 U
使用单独的(显式)后缀树。诀窍是在构建后缀树之前反转这个词。要查找同时也是 U
前缀的 S
的最长后缀,请使用此单独的后缀树来查找反转字符串 S
的最长前缀> 这也是反转字符串 U
的后缀。只需从根开始搜索这棵后缀树,选择与反转字符串 S
匹配的分支,并记住带有字符串结束标记的最新节点。然后将根节点到该节点的路径上的字符串进行反转(或者确定这条路径的长度,从S
的尾部复制相同长度的子字符串)。
关于algorithm - 在 Ukkonen 算法构造的隐式后缀树中搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14274154/
我目前正在研究我自己的后缀树实现(使用 C++,但问题仍然与语言无关)。我研究了 the original paper from Ukkonen 。这篇文章非常清楚,所以我开始着手我的实现并尝试解决通
我了解 ukkonen's algorithm .我只是好奇如何将它扩展为包含多个字符串(以特殊字符“$”结尾)。 我在某处读到给定字符串 s1(比如“abcddefx$”)和 s2(比如“abdde
我正在寻找一种比普通 O(nm) 编辑距离算法性能更好的算法,读到它具有 O(nd) 最坏情况时间复杂度,但找不到任何合适的解释。有人可以解释一下算法是如何工作的吗? 最佳答案 Ukkonen 算法的
是的,我读过这个:Ukkonen's suffix tree algorithm in plain English? 这是对算法的一个很好的解释,但让我失望的不是算法本身,而是用于实现它的数据结构。
我已阅读帖子 Ukkonen's suffix tree algorithm in plain English? .但目前还不清楚如何使用该算法获得叶子标签。 在后缀树中,叶子标签是数字 i,使得 S
我遇到了一个问题,它需要一个数据结构来保存字符串 S 并允许我: 在 O(|W|) 时间内检查词 W 是否是 S 的子词 在 O(|U|) 时间内找到同时也是给定单词 U 前缀的 S 的最长后缀 在
我一直在为我的工作阅读 Ukkonen 的后缀树,并想确认以下内容是否属实。 在 Ukkonen 后缀树中这样说是否正确: Only edges that lead to leaf nodes can
这个问题在这里已经有了答案: Ukkonen's suffix tree algorithm in plain English (7 个答案) 关闭 9 年前。 我正在使用 Ukkonen 的算法来
我正在尝试使用 ukkonen 的后缀树来比较文档。 此时我担心两件事: 首先,我尝试为一个文档生成后缀树,然后使用该后缀树查找该文档中的所有公共(public)子字符串。 接下来是识别两个文档之间的
是否有用于在 C++ 中构建后缀树的 Ukkonen 算法的实现?任何高级语言的实现都很好。 最佳答案 这是 Mark Nelsons 的文章,末尾附有源代码: http://marknelson.u
“canonize”函数(下面给出,来自 Ukkonen 的论文)是如何工作的,特别是 while 循环何时结束?我认为 p' - k' 的值将始终小于 p - k 的值。我是对还是错? proced
ukkonen's on line construction algorithm 我在尝试理解“测试和拆分”过程时遇到了问题,具体如下:程序 test–and–split(s, (k, p), t):
是否可以使用 Ukkonen 算法通过 KMP 和后缀树找到最长公共(public)子串、最长回文子串、最长重复子串、搜索所有模式和子串检查?如果是,那么我应该使用哪一个,因为这两种算法都具有线性时间
我尝试根据 Mark Nelson 在 java 代码中实现的 Ukkonen 算法构建后缀树,它是以下代码的变体: http://www.sanfoundry.com/java-program-im
我是一名优秀的程序员,十分优秀!