sunday算法

本文介绍了由Daniel M. Sunday在1990年提出的Sunday算法,这是一种用于字符串匹配的高效算法,相较于Boyer-Moore算法,它通过从左到右扫描并利用特定的跳转策略来提高搜索效率。文章详细解释了Sunday算法的工作原理,并通过实例展示了如何实现该算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    原帖:http://kmplayer.iteye.com/blog/704187

    1.Sunday算法是Daniel M.Sunday于1990年提出的一种比BM算法搜索速度更快的算法。 
    2.Sunday算法其实思想跟BM算法很相似,只不过Sunday算法是从前往后匹配,在匹配失败时关注的是文本串中参加匹配的最末位字符的下一位字符。如果该字符没有在匹配串中出现则直接跳过,即移动步长= 匹配串长度+ 1;否则,同BM算法一样其移动步长=匹配串中最右端的该字符到末尾的距离+1。 
   3.举例: 

      匹配串:abcbczdxzc 
      模式串:zbcac 

      这里我们看到z-a没有对上,我们就看匹配串中的z在模式串的位置,然后对齐。 
      匹配串:abcbczdxzc 
      模式串:         zbcac 

      如果模式串中的没有那个字符的话就跳过去。 
      匹配串:abcbcedxzcs 
      模式串:zbcac 
      e不在模式串中出现,那么我们就 
      匹配串:abcbcedxzcs 
      模式串:           zbcac 

       

#include <iostream>
#include <cstring>
using namespace std;

int sunday(const char* src, const char* des)
{
	int len_s = strlen(src);
	int len_d = strlen(des);
	int next[26] = {0};
	for (int j = 0; j < 26; ++j)
		next[j] = len_d + 1;
	for (int j = 0; j < len_d; ++j)
		next[des[j] - 'a'] = len_d - j; //记录字符到最右段的最短距离+1
	//例如:des = "abcedfb"
	//next = {7 1 5 4 3 2 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8}
	int pos = 0;
	while (pos < (len_s - len_d + 1)) //末端对齐
	{
		int i = pos;
		int j;
		for (j = 0; j < len_d; ++j, ++i)
		{
			if (src[i] != des[j])
			{
				pos += next[src[pos + len_d] - 'a'];
				//不等于就跳跃,跳跃是核心
				break;
			}
		}
		if ( j == len_d )
			return pos;
	}
	return -1;
}


int main()
{
    char src[]="abcdacdaahfacabcdabcdeaa";
    char des[]="abcde";
    cout<<sunday(src,des)<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值