数据结构——BF算法

(本文章仅对上课所学进行总结)

BF(Brute-Force)算法:最简单直观的模式匹配算法。

[算法步骤]

     1.分别利用计数指针i和j指示主串S和模式串T中当前正待比较的字符位置,i初值为pos,j的初值为0。

     2.如果两个串均未比较到串尾,即i和j均分别小于等于S和T的长度时,则循环执行以下操作:

         ·S.ch[i]和T.ch[j]比较,若相等,则i和j分别指示串中下个位置,继续比较后续字符;

         ·若不等,指针后退重新开始匹配,从主串的下一个字符(i=i-j+1)起再重新和模式串的第一个字符(j=0)比较。

      3.如果j>T.length-1,说明模式串T中的每个字符依次和主串S中的一个连续的字符序列相等,则匹配成功,返回和模式T中第一个字符相等的字符在主串S中的序号(i-T.length+1);否则称匹配不成功,返回0。

[算法描述]

int BF(SString S,SString T,int pos)
{
	int i,j;
	i=pos;
	j=0;
	while(iT.length-1) 
		return i-T.length+1;
	else 
		return 0;
}

int BF(SString,SString,int);

[算法分析]

BF算法的匹配过程易于理解,且在某些应用场合效率也较高。在匹配成功的情况下,考虑以下两种极端情况。

(1)最好的情况下,每趟不成功的匹配都发生在模式串的第一个字符与主串中相应字符的比较。

         设主串的长度为n,子串的长度为m,假设从主串的第i个位置开始与模式串匹配成功,则在       前i-1趟匹配中字符总共比较了i-1次;若第i趟成功的字符比较次数为m,则总比较次数为i-1+m。     对于成功匹配的主串,其起始位置由1到n-m+1,假定这n-m+1个起始位置上的匹配成功概率相       等,则最好的情况下匹配成功的平均比较次数为

\sum_{i=1}^{n-m+1} pi\left ( n-1+m \right )=\frac{1}{n-m+1}\sum_{i=1}^{n-m+1}i-1+m=\frac{1}{2}\left ( n+m \right )

   即最好情况下的平均时间复杂度为O(n+m)。

(2)最坏的情况下,每趟不成功的匹配都发生在模式串的最后一个字符与主串中相应字符的比较。

          假设从主串的第i个位置开始与模式串匹配成功,则在前i-1躺匹配中字符总共比较了(i-1)       *m次;若第i躺成功的字符比较次数为m,则总比较次数为i*m。因此最坏情况下匹配成功的平均     次数为

\sum_{i=1}^{n-m+1}pi\left ( i*m \right )=\frac{1}{n-m+1}\sum_{i=1}^{n-m+1}i*m=\frac{1}{2}m*\left ( n-m+1 \right )

   即最坏情况下的平均时间复杂度为O(n*m)。

[代码演示]

#include
#include
#include
#define Maxsize 10
typedef struct//定义串
{
	char ch[Maxsize+1];
	int length;
}SString;
int BF(SString,SString,int);
int main()
{
	SString S,T;int k=0;
	printf("Please input the main string:");//输入主串
	scanf("%s",S.ch);
	printf("Please input the pattern string:");//输入模式串
	scanf("%s",T.ch);
	S.length=strlen(S.ch);
	T.length=strlen(T.ch);
	k=BF(S,T,0);
	printf("The position of pattern string is %d",k);
}
int BF(SString S,SString T,int pos)
{
	int i,j;
	i=pos;
	j=0;
	while(iT.length-1) 
		return i-T.length+1;
	else 
		return 0;
}

[运行结果]

数据结构——BF算法_第1张图片

你可能感兴趣的:(数据结构,算法)