有关字符串模式匹配BF算法的时间复杂度的问题?

tufengtao 2006-11-06 04:47:59
问题是:采用定长顺序存储结构,不依赖其他串操作的匹配算法,求子串位置的定位函数 Index(S, T, pos)
//这是算法的实现
int Index(SString S, SString T, int pos)
{ // T是非空串,也称为模式,1<=pos<=S的长度。
// 若主串S中存在和模式T相同的子串,则返回它在主串 
// S中第pos个字符之后第一次出现的位置;否则返回0。
i = pos; j = 1;
while(i<=S[0] && j <= T[0]){
if(S == T[j]) { ++i; ++j;} // 继续比较后续字符
else { i = i-j+2; j =1;} // 指针后退重新开始匹配
}
if(j > T[0]) return i-T[0]; // 匹配成功
else return 0; // 匹配不成功
}
假设n = StrLength(S);m = StrLength(T);
它(参考书)说:“最好情况的复杂度为O(n+m);最坏情况的复杂度为O(n*m)”。这是怎样算出来的呢?按照我的理解,对于这道题目,它的最好情况的复杂度应为O(m),而最坏的情况为也不应该是O(m*n),而应是"某个数(小于n)*m",因为i会大于S[0],循环会提前结束。请大家帮帮我?
...全文
1086 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
LiChenYue 2006-11-18
  • 打赏
  • 举报
回复
你认为是O(m),也许是因为N的第一个字符就能和M配上,对吧?而书上的意思是N中指针不回退的情况下的最好情况,
而最坏情况是一个都配不上,就是N*M了!
LiChenYue 2006-11-07
  • 打赏
  • 举报
回复
不要管什么复杂度,一般程序设计根本没必要!
tufengtao 2006-11-06
  • 打赏
  • 举报
回复
????
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 模式匹配是计算机科学中一种关键的字符串处理技术,广泛应用于文本搜索、数据分析等场景。它主要用于在一个较长的字符串(主串)中查找一个较短的字符串(模式串)是否出现。本文主要探讨两种经典的模式匹配算法:BF(暴力)算法和KMP(Knuth-Morris-Pratt)算法。 BF算法是最直接的解决方法,通常被称为朴素匹配算法。其核心思想是从主串的第一个字符开始,逐个与模式串的字符进行比较。一旦发现不匹配,主串的指针会回退一位,而模式串的指针则重新回到起始位置,然后继续下一轮比较。这个过程会一直重复,直到找到匹配的子串或者主串结束。BF算法时间复杂度为O(mn),其中m是模式串的长度,n是主串的长度。这种算法虽然简单易懂,但效率较低,尤其是在处理大规模数据时。 KMP算法是对BF算法的优化。它通过避免不必要的回溯来提高效率。KMP算法的关键在于构造一个“部分匹配表”(也称为失配表)。这个表记录了模式串中每次不匹配时,模式串应该回退的位数。通过这个表,我们可以利用已经匹配的部分子串信息,直接跳过已匹配的部分,而不是从头开始比较。这大大减少了比较次数,从而提高了匹配效率。KMP算法的时间复杂度同样是O(mn),但由于减少了回溯操作,其实际运行速度通常比BF算法更快。 在实现KMP算法时,首先需要构建模式串的“部分匹配表”。该表的构建基于这样一个原则:如果模式串的前i个字符既是一个前缀,也是一个后缀(即这i个字符的子串同时也是从第一个字符开始的子串),那么在发生不匹配时,模式串的指针可以回退i-1位。例如,模式串“abab”的部分匹配表为[0, 0, 1, 2]。当比较到第三个字符时不匹配时,可以直接将模式串的指针回退2位,继续匹配。 学习这两种算法不仅能帮助我们理解它们的基本原理,还能深入掌握字

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧