- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
KMP 算法需要一个前缀表,以便在失败后知道它可以安全地跳过多少个字符。前缀表的一般思想是,它会告诉你对于给定的模式 P
,在给定的位置 i
有一个字符 C
, C
的后缀与 P
的前缀共有多少个字符:
int[] T = new int[P.length()];
int i = 0;
for (int j = 1; j < P.length(); ++j) {
if (P.charAt(j) == P.charAt(i)) {
i++;
} else {
i = 0;
}
T[j] = i;
}
这是我想出来的。我环顾四周,实现似乎总是不同的。我试过玩弄几个例子(比如 ABABACA),但都是我的实现,例如这个 KMP prefix table似乎产生相同的结果。
任何人都可以告诉我我的实现中的逻辑错误是什么,以及在为 KMP 算法生成正确的前缀表时使用什么样的输入会失败?
谢谢
最佳答案
您的算法的一个特征是表中的每个条目都比前一个条目多 0 或 1。所以挑战是找到一个字符串,其中表中的条目小于前一个条目,但不为 0。
一个这样的字符串是“ABACABABC”(来自 this wikipedia article )。
前缀表是
{0,0,1,0,1,2,3,2,0} from the linked answer
{0,0,1,0,1,2,3,0,0} your proposed code
^------different here
感兴趣的条目是 3 后跟 2。
考虑当 7 个字符匹配时会发生什么。输入字符串看起来像
ABACABA?
在哪里?是不匹配的字符,所以 ?不是 B。ABA?
可能与 ABAC
匹配,因此前缀长度为 3。
现在考虑当 8 个字符匹配时会发生什么:
ABACABAB?
在哪里?不是 C。在这种情况下 AB?
可以匹配 ABA
,因此前缀长度为 2。
这表明前缀表可以有一个小于前一个条目的条目,但不是 0。
关于algorithm - 更简单的 KMP 前缀表构建。这个实现会有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50243386/
KMP 算法实例详解 KMP算法,是由Knuth,Morris,Pratt共同提出的模式匹配算法,其对于任何模式和目标序列,都可以在线性时间内完成匹配查找,而不会发生退化,是一个非常优秀的模式匹配
我正在尝试使用搜索算法KMP来计算模式出现次数和所需比较(在下面的代码中称为匹配)。 我尝试执行以下操作: public class KMP { private String pat;
我想搜索一个字符串(假设a)在字符串b中出现了多少次。我想过实现 Knuth-Morris-Pratt 算法,但我更喜欢内置的 java 函数。有这样的功能吗?我希望该函数的复杂性尽可能最低,因为我多
有人要求我了解 KMP DFA,我在书中找到的是该实现,但我们的讲师一直称其为“前缀函数”。我真的不明白这个功能是哪一部分,有人可以给我解释一下吗?很抱歉,如果有人在某个地方问过这个问题,但我找不到。
我正在尝试使用 CLRS 实现 KMP 字符串匹配算法,但是文本输入为“bbaa”,模式输入为“aab”,它陷入了 while 的无限循环在 getKMPPrefix 函数中循环。我的代码如下: pr
KMP 算法在最佳情况下的最少比较次数是多少? 最佳答案 最好的情况是您要查找的字符串刚好位于文本字符串的开头。在这种情况下,如果您要在 n 字母字符串中查找 k 字母字符串,则最好的比较次数是 k。
我已经实现了用于在字符串 B 中搜索字符串 A 的 Knuth-Morris-Pratt 算法。如果找到字符串,则返回字符串的第一个位置,否则返回 -1。但是现在我想统计字符串 A 在字符串 B 中的
最近学习了KMP字符串匹配算法,差不多搞定了。但我不明白的是如何在 O( length_of_pattern ) 中构建故障函数。我不需要代码,如果可能,我需要一个清晰的解释。提前致谢! 最佳答案 来
想知道是否有人可以提供一些关于选择 KMP 和后缀树之间的利弊的建议,如果我们想看看一个字符串是否是另一个字符串的子字符串?谢谢。 提前致谢,林 最佳答案 运行时和内存复杂度大致相同。您在 O(N)
如我所见,在 KMP 中构建故障/前缀表的主要函数(在所有在线资源中,甚至在这个 answer _ 中,如下所示: int j = 0; for (int i = 1; i 0 && pa
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
扩展kmp既是求模式串和主串的每一个后缀的最长公共前缀 即令s[i]表示主串中以第i个位置为起始的后缀,则B[i]表示s[i]和模式串的最长公共前缀 显然KMP是求s[i]=模式串长度的情况,所
先声明,本人菜鸟一个,写博客是为了记录学习的过程,以及自己的理解和心得,可能有的地方写的不好,希望大神指出。。。 抛出问题 给定一个文本串test_str(被匹配的字符串)和模式串pat_str
恐怕现在用过电脑的人,一定都知道大部分带文本编辑功能的软件都有一个快捷键ctrl+f 吧(比如word)。这个功能主要来完成“查找”,“替换”和“全部替换”功能的,其实这就是典型的模式匹配的应用,即
我想统计一篇文章的词频。 我的想法是先创建一个struct数组 struct{ char[WORD_SIZE] }data[MAX_WORD_NUMBER]; 然后读取每个字符然后确
您好,我正在尝试编写 KMP search 的 C# 版本来自 C 书中的算法。无法找到我的算法中的缺陷。有人愿意帮忙吗? static int KMP(string p, string str) {
我想找到字符串 S 中与正则表达式 R 匹配的所有子字符串。正则表达式只能包含“.”和符号(其中“.”表示任何符号)。我正在尝试使用 KMP 来解决这个问题: 1) 构建字符串 T = R + '#'
从函数返回一个向量会产生什么问题吗?还是只是一些基本的语法问题? 这只是CLRS中的示例代码. computePrefix 函数计算给定模式的正确前缀的值,并匹配主函数中的值。 获取 SIGSEGV
我正在寻找一种有效的算法,以在将 pattern 与文本进行比较时允许不匹配(最多 3 个)。原始 KMP 在我的数据上有效地完成了这项工作,但正在考虑扩展该算法以适应不匹配情况。 对于我的情况:GA
我是一名优秀的程序员,十分优秀!