-
目前最常用的此类算法是改进的KMP算法。 *name:KMP算法演示。
kapinterdata: 08-07-06 20:17description:
字符串模式匹配的朴素算法为O(n 2),可以使用KMP(Proposed by , , )算法改进为线性算法。 KMP 算法和朴素算法的区别在于处理"失 配"情况。 KMP 算法不是完全回溯指针,而是首先根据已部分匹配的信息,将匹配指针跳过不必匹配的位置。
#include #include #include int index(char *,char *)int kmp(char *,char *)int main();for (int i=0; i<3; i++)else }int kmp(char *s, char *t)else }void getnext(char *t, int lt, int *next)j = -1;i = 0;while (i < lt)else }else }cout<<"下一个数组:"A A A A B-1 -1 -1 -1 -1 -1 3KMP 算法: 12 穷举模式匹配: -1下一个数组:
s a f a s s f-1 0 0 0 -1 0 2 1kmp 算法: -1按任意键继续
-
本书中有几种方法可以匹配数据结构。 模式匹配、KMP算法等 KMP算法的时间复杂度为O(m+n)。 有关详细信息,您可以查看有关数据结构的书。 KMP 算法为:Cnut-Morris Pratt 算法。
-
最常见的是朴素字符串匹配,还有KMP算法匹配,你问其中一个? 还是其他算法?
-
假设 string1="abcde",string2="bcd",分析逻辑如下:
1.如果 string2 比 string1 长,则不匹配。
2.如果 string1 的剩余字符串长度小于 string2 的长度,则不匹配。
3.当满足上述条件时,string1 中的下一个字符与 string2 中的第二个字符匹配,以此类推,一旦出现不匹配,就没有匹配。 返回步骤 2 并查找与 string2 的第一个字符匹配的下一个字符。
4.如果 string2 中的所有字符都匹配,则表示 string2 中的 string1 被识别。
-
如果您只是在寻找子字符串,请考虑 KMP 算法。
-
传统的匹配算法。
虽然字符串匹配算法已经发展了几十年,但非常实用的算法直到最近几年才出现。 在字符串匹配问题的研究中,理论研究与实际应用之间存在脱节。 那些专门研究算法的人关心的是那些在理论上看起来很棒的算法——但时间复杂度很高。
开发人员只寻找在实际应用中尽可能快的算法。 两人从不注意对方在做什么。 将理论研究与实际应用相结合的算法,例如BNDM算法,是近年来才出现的。
在实践中,通常很难找到满足需求的正确算法——这种算法确实存在,但只有经验丰富的专家才知道它们。 考虑这样一种情况:软件开发人员、计算生物学家、研究人员或学生对字符串匹配领域没有深入的了解,但现在需要处理文本搜索问题。 那些书里满是汗水,读者淹没在各种匹配算法的海洋中,却没有足够的知识去选择最合适的。
最后,它通常会导致选择最简单的算法之一来实现它的情况。 这通常会导致性能不佳,从而影响整个开发系统的质量。
更糟糕的是,我们选择了一种理论上看起来很漂亮的算法,并投入了大量精力来实现它。 结果,事实证明,实际效果与简单算法相似,甚至不如简单算法。 因此,应该选择一种“实用”的算法,即在实际应用中具有良好的性能,一个普通的程序员可以在几个小时内实现**。
此外,在字符串匹配研究领域,“算法的想法越简单,实际应用越好”是众所周知的事实。
传统的字符串匹配算法可以概括为前缀搜索、后缀搜索和子字符串搜索。 代表性算法包括 kmp、shift-and、shift-or、bm、horspool、bndm、bom 等。 使用的技术包括滑动窗口、位并行、自动机、后缀树等。
使用字符串就是使用它的第一个地址(有时和长度,实际上,拥有第一个地址就足够了),无论字符串有多长。 最明显的例子是,当一个(常量)字符串作为参数及其第一个地址传递时。 所以你的比较只是地址的比较。
您可以尝试输出,scanf 函数是从缓冲区读取的数据,第二个字符串的数据是空格或换行符制表符。 您可以单独读取它们,但在两者之间添加 fflush(stdin); 清除缓冲区。