100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > c语言实现bf算法的定位函数 数据结构c语言版严蔚敏清华大学出版社第四章串.ppt...

c语言实现bf算法的定位函数 数据结构c语言版严蔚敏清华大学出版社第四章串.ppt...

时间:2022-12-12 08:05:00

相关推荐

c语言实现bf算法的定位函数 数据结构c语言版严蔚敏清华大学出版社第四章串.ppt...

数据结构c语言版严蔚敏清华大学出版社第四章串

模式匹配(定位) 设有主串S和子串T(将S称为目标串,将T称为模式串),在主串S中,从位置start开始查找,如若在主串S中找到一个与子串T相等的子串,则返回T的第一个字符在主串中的位置,否则返回-1。 算法目的 确定主串中所含子串第一次出现的位置(定位) 算法种类 BF算法 (又称古典的、经典的、朴素的、穷举的) KMP算法 Brute-Force算法的设计思想: 将主串S的第一个字符和模式T的第1个字符比较, 若相等,继续逐个比较后续字符; 若不等,从主串S的下一字符起,重新与T第一个字符比较。 直到主串S的一个连续子串字符序列与模式T相等。返回值为S中与T匹配的子序列第一个字符的序号,即匹配成功。 否则,匹配失败,返回值 –1。 BF算法的时间复杂度 讨论: 若n为主串长度,m为子串长度,则串的BF匹配算法最坏的情况下需要比较字符的总次数为(n-m+1)*m=O(n*m) 最好的情况是:一配就中! 只比较了m次。 最恶劣情况是:主串前面n-m个位置都部分匹配到子串的最后一位,即这n-m位比较了m次,别忘了最后m位也各比较了一次,还要加上m!所以总次数为:(n-m)*m+m =(n-m+1)*m KMP算法设计思想: 设s为主串,t为模式串,设i为主串s当前比较字符的下标,j为模式串t当前比较字符的下标,令i和j的初值为0。当si = tj时,i和j分别增1再继续比较;否则 i不变,j改变为next[j]值(即模式串右滑)后再继续比较。依次类推,直到出现下列两种情况之一:一是 j退回到某个j=next[j]值时有si = tj ,则 i和j分别增1后再继续比较;二是j退回到j=-1时,令主串和子串的下标各增1,随后比较si+1和t0 。这样的循环过程一直进行到变量大于等于S.length或变量j大于等于T.length时为止。 KMP算法的时间复杂度 注意:由于BF算法在一般情况下的时间复杂度也近似于O(n+m),所以至今仍被广泛采用。 第四趟匹配 ababcabcacbab abcac 第五趟匹配 ababcabcacbab a 第六趟匹配 ababcabcacbab abcac i=4 j=1 i=5 j=1 i=11 j=6 能否利用已部分匹配过的信息而加快模式串的滑动速度? 能!而且主串S的指针i不必回溯!最坏情况也能达到O(n+m) 请看KMP算法! 当模式串为,主串为’00000000000000000000000000000000000000000000000000001’时,整个匹配过程中指针i需回溯45次. a b a 尽量利用已经部分匹配的结果信息,尽量让i不要回溯,加快模式串的滑动速度。 例: S=‘a b a b c a b c a c b a b’ T=‘a b c a c’ S=‘a b a b c a b c a c b a b’ T=‘a b c a c’ S=‘a b a b c a b c a c b a b’ T=‘a b c a c’ 需要讨论两个问题: ①如何由当前部分匹配结果确定模式向右滑动的新比较起点k? ② 模式应该向右滑多远才是高效率的? i i i k k a b c k i i 2、KMP算法 T=‘a b c a c’ S=‘a b a b c a b c a c b a b’ i k S=‘a b a b c a b c a c b a b’ T=‘a b c a c’ i k 奇妙的结果: k 仅与模式串T有关! 请抓住部分匹配时的两个特征: 两式联立可得:“T0…Tk-1”=‘Tj-k …Tj-1’ 则T的k-1~0=S前i-1~i-k)位 设目前打算与T的第k字符开始比较 (1) (2) ‘T0 … Tk-1’ 则T的j-1~j-k位= S前i-1~i-k)位 刚才肯定是在S的i处和T的第j字符 处失配 ‘Tj-k …Tj-1’ 截取一段,但k有限制,0

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。