Questions tagged «string-matching»

1
拉宾–卡普vs卡普–拉宾
维基百科的其他明智编辑拒绝了我的请求,因为我将Rabin-Karp算法中有关Wikipedia的文章移至我认为应该称为Karp-Rabin算法的原因,是因为Rabin-Karp名称的使用频率更高(错误(如果使用Google学术搜索的数字),或者听起来更好(真的?)。最初的出版名称顺序是Karp和Rabin,按字母顺序排列,就像理论论文通常那样,这就是为什么我要求这样做。 Rabin–Karp名称排序的主要支持者是Cormen–Leiserson–Rivest–Stein 算法入门教科书。除非有大量新证据出现,否则Wikipedia的结果不太可能改变,而且Rabin或Karp不太可能关心信誉,但是现在我很好奇:任何读者都记得这一历史吗,并有任何解释吗?为什么CLRS(或其他任何人)选择Rabin–Karp名称顺序?ϵϵ\epsilon

8
快速计算Levenshtein距离
给定一个庞大的允许单词(按字母顺序排序)和单词的数据库,请从数据库中找到就Levenshtein距离而言最接近给定单词的单词。 当然,幼稚的方法是简单地计算给定单词与字典中所有单词之间的levenshtein距离(我们可以在实际计算距离之前在数据库中进行二进制搜索)。 我想知道是否有一个更有效的解决方案。也许可以通过某种启发式方法来减少搜索的单词数,或者对levenshtein距离算法进行优化。 欢迎访问有关该主题论文的链接。

2
n维图案匹配
在n维数组中找到精确的n维子数组有哪些已知结果? 在1D中,这只是一个字符串匹配问题,KMP在线性时间内完成。 在2D模式下,本文显示了它可以在线性时间内完成,几乎没有多余的空间。 对于任何固定尺寸,是否可以在线性时间最坏情况下解决此问题?

2
通过移动操作编辑距离
动机:合著者编辑手稿,我希望看到这些编辑的清晰摘要。如果您同时移动文本(例如,重新组织结构)并进行本地编辑,则所有类似于“ diff”的工具都将无用。真的很难做到正确吗? 定义:我想找到最小的编辑距离,其中允许的操作是: “便宜”操作:添加/更改/删除单个字符(通常的Levenshtein操作), “昂贵”:操作:将子字符串移动到新位置(任何字符串,,,)。一b Ç dabcd↦acbdabcd↦acbdabcd \mapsto acbdaaabbbcccddd 给定两个字符串和以及整数和,我想解决以下问题:ÿ ķ ķxxxyyykkkKKK 您最多可以使用廉价操作和最多昂贵操作将转换为吗?ÿ ķ ķxxxyyykkkKKK 问题: 这个问题有名字吗?(在序列比对的背景下,这听起来像是一个非常标准的问题。) 难吗? 如果比较困难,是否可以使用作为参数来处理固定参数?KKK 有高效的近似算法吗?(例如,如果存在具有廉价操作和昂贵操作的解决方案,则找到一个最多具有便宜和昂贵操作的解决方案。)2 K k K2k2k2k2K2K2KkkkKKK 我试图看一下Wikipedia中列出的字符串指标,但是没有一个看起来正确。

1
回文覆盖线
如果给定字符串,一个回文盖是一个序列p 1个p 2 ⋯ p 米字的p 我使得p 1 p 2 ⋯ p 米 = 瓦特和,使得每个p 我是回文。w=σ1σ2…σnw=σ1σ2…σnw=\sigma_1\sigma_2\ldots\sigma_np1p2⋯pmp1p2⋯pmp_1p_2\cdots p_mpipip_ip1p2⋯pm=wp1p2⋯pm=wp_1p_2\cdots p_m = wpipip_i 找到最小的回文覆盖面有多难?(这似乎可以通过动态编程来实现,但是我不确定它是否有效)。 如果将输入作为每个回文长度的界,问题是否会变得更加棘手?bbb 考虑简单的贪心算法,该算法始终采用从当前位置开始的最长回文。例如,如果,则它将输出(121 )⋅ (33 )⋅ (1 )⋅ (2 ),而最佳覆盖率是(1 )⋅ (213312 )。w=1213312w=1213312w=1213312(121)⋅(33)⋅(1)⋅(2)(121)⋅(33)⋅(1)⋅(2)(121)\cdot(33)\cdot(1)\cdot(2)(1)⋅(213312)(1)⋅(213312)(1)\cdot(213312) 贪心算法是否为问题提供2近似值?

1
斐波那契词
我在旧的捷克算法教科书中遇到以下问题,可惜没有任何提示或解决方案。 “我们定义斐波那契字作为,˚F 1 = b,˚F ñ + 2 = ˚F ñ ˚F ñ + 1,其中一个和b是一般的信件。如何给定的字符串(超过一个潜在的大字母)可以吗找到线性时间最长的斐波那契子词?”F0= 一个F0=aF_{0}=aF1个= bF1=bF_{1}=bFn + 2= FñFn + 1Fn+2=FnFn+1F_{n+2}=F_{n}F_{n+1}aaabbb 我知道二次方的解,但不能将其简化为线性。谁能指出我正确的方向?

2
均质字符串的复杂性
动机:在开发用于数据版本控制的工具时,我们最终提出了“区分”两组整数的算法,方法是提出一系列将一组整数转换为另一组的转换。我们能够将这个问题简化为以下非常自然的问题,该问题似乎具有编辑距离,通过交换分组和最小公共字符串分区的连接。 问题:我们给了一个字符串,即一个字母序列,我们的目标是以最小的成本将其 均匀化。也就是说,我们需要重新排列序列,以使所有相似的字母彼此相邻。 唯一允许的操作是拾取一个相似的字母子序列,然后将该子序列移动到任何位置,这将花费我1个单位。 表征此问题的复杂性的任何帮助将不胜感激! 范例: aabcdab:输入 bcd aa ab:将第一个aa移到“ d”之后的位置之后 b bcdaaa:将结尾的b移动到第一个位置后 由于生成的字符串是同质的,因此成本为2。 请注意,我们对输出没有任何限制:只要它是同质的,我们就不需要确保任何特定的顺序。

4
可以使用后缀树查找所有常见的子字符串吗?
我正在尝试使用后缀树来比较字符串序列。我发现使用后缀树的最长公共子字符串问题的实现/理论。但是,我正在寻找的是相关问题的讨论-“所有常见子字符串”。具体来说,我有一个问题,我需要首先找到最长的公共子字符串,然后找到不包括已经找到的lcs索引的下一个最长的公共子字符串,依此类推直到最小长度。通过为两个序列构造一次通用后缀树(GST)可以解决此问题吗?我知道可以通过在每次查找和删除LCS的迭代之后重复构建GST来解决。但是,我想知道我是否错过了一个精巧的技巧,即在GST中仅构造一次。

3
字符串中的排列模式匹配
宽松地说,排列模式匹配处理以下类型的问题: 给定的排列在S_N和\西格玛在S_M,与米\当量Ñ,并\ PI包含一个子序列\ tau蛋白的长度米的元素根据排序\西格玛?ππ\pi小号ñSnS_nσσ\sigma小号米SmS_m米≤ Ñm≤nm\leq nππ\pi ττ\tau米mmσσ\sigma 例如,如果π= ⟨ 3 1 5 4 2 8 6 7 ⟩ π=⟨3 1 5 4 2 8 6 7⟩\pi=\langle 3\ 1\ 5\ 4\ 2\ 8\ 6\ 7\rangle和σ= ⟨ 2 1 3 ⟩ σ=⟨2 1 3⟩\sigma=\langle 2\ 1\ 3\rangle,则子序列3 1 4 3 1 43\ …


1
确定一个通配符字符串是否与集合中的另一个通配符字符串完全匹配
这是困扰我一段时间的问题。假设字符串是1和0 的序列,通配符字符串是1、0和?s的序列。所有字符串和通配符字符串具有相同的长度。这些是标准的UNIX通配符。10 ?? 1匹配10011、10111等-a?在该位置匹配1或0。如果和是通配符字符串,那么如果与匹配的每个字符串也与匹配,则我们写。vvvwwwv ≤ w ^v≤wv \leq wvvvwww 问题:给定一组通配符字符串和一个查询(也是通配符字符串),是否存在使得吗?如果不是,我们可以有效地将添加到吗?小号SSvvvw ^ ∈ 小号w∈Sw \in Sv ≤ w ^v≤wv \leq wvvv小号SS 这是显而易见的解决方案(其中是字符串的大小,是RAM的字大小(通常为32或64)):遍历列表中的每个元素并进行测试条件(可以使用位旋转2或3个操作来完成)。还要在扫描时测试是否适合任何。如果未能通过我们的测试,则将添加到集合中,并删除我们标记的。O (ķ米n )O(kmn)O(\frac{k}{m}n)ķkk米mmv ≥ w ^v≥wv \geq wwwwvvvvvvwww 但这还不够快。如果有解决方案,或者在理想情况下,复杂度类似于基数树(),那真的很酷。查询大致正确也可以:即,如果,则返回yes或no;否则,返回false。但是如果条件不成立,则绝对不返回。O (对数n )O(log⁡n)O(\log n)O(k)O(k)O(k)v≤wv≤wv \leq w 尽管这并不能解决最坏的情况,但是您可以假定中的所有元素都由通配符字符串限制;也就是说,存在一些,使得对于所有,。SSSvvvw∈Sw∈Sw \in Sv≥wv≥wv \geq w 我尝试过的想法 通配符字符串形成联接符号。我们可以有一棵包含通配符字符串的n元树;叶子将是通配符字符串,分支将代表所有子代的联接。如果查询和联接是不可比拟的,那么我们不必浪费时间尝试与该分支的所有子代进行比较。此外,如果我们进行更新,而该更新恰好大于联接,则可以简单地删除整个分支。不幸的是,在最坏的情况下,这仍然是,并且在遍历树中添加元素时,我们并不总是找到建立的“最佳”联接。O(n)O(n)O(n) 一个可以形成的基数树根。我们知道由一些通配符字符串限制;假设它是0到0。然后,特里树的所有分支只需位于字符串的第1位和第3位。如果查询的当前位是1,则必须检查?。1个分支;如果为0,我们检查?0个分支;如果是?,我们只检查?。科。因为我们必须潜在地采取多个分支,所以这看起来不太好(出于相同的原因很难更新trie)。由于匹配是非常快速的操作,因此与幼稚的策略相比,在树中进行大量遍历会比较麻烦(遵循一堆指针比进行一些OR和AND的代价高得多)。SSSSSS 相关工作 在网络社区中,此问题表现为“数据包分类”,这是对已知算法和数据结构的良好概述。不幸的是,几乎总是假设通配符字符串仅匹配前缀,并且查询是此类字符串的元组。当然,我们总是可以转换通用通配符字符串来满足以下条件:1?00?1 ?? 是(1,?,0,0,?,1,?,?)。但是,这将是无效的。做出的另一个假设是,这些元组与“颜色”相关联,并且查询应返回颜色(不仅仅是匹配的颜色)。这使问题变得更加困难,因为我们必须对元组进行排序(否则,(0,?)和(?,1)中的哪一个与(0,1)相匹配是模棱两可的)。 在算法社区中,我发现了很多与查找与“无关”匹配的子字符串相关的结果。这是一个相当困难的问题,我无法真正利用任何技术。 结论 谢谢你的帮助!
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.