bm搜索算法

bm是一种单模搜索算法

下面给出一般性的代码,可运行

#include "stdio.h"
#include "string.h"
/*
基于二进制的bm搜索算法  区分大小写 可以 混杂二进制不可见字符
*/
typedef int (*lookback)(int pos,int times);  //bm中搜索回调函数  第一个参数为匹配位置 ,第二个参数为匹配次数

int InitBadWord(int bw[],const unsigned char substr[],const int len)  //坏字表的初始化 区分大小写
{
	memset(bw,0,sizeof(int)*256);
	int index=0;
	for(index=0;index<256;index++)
	{
		bw[index]=len;
	}
	for(index=len-2;index>=0;index--)
	{
		bw[substr[index]]=len-1-index;
	}
	return 0;
}
int bmseek(const unsigned char *tarstr,const int  tarlen,const unsigned char *sub,const int len,const int bw[],const lookback fun)   // bm查找  跳字符查找
{
	int times=0;
	const unsigned char *strp=tarstr;
	char endch=0;
	int pos=0;
	times++;

	do
	{
		times++;
		endch=tarstr[pos+len-1];
		pos+=bw[endch];
		strp=tarstr+pos;
		if(pos+len>tarlen)
			break;
		if(memcmp(strp,sub,len)==0)
		{
			if(fun(pos,times)==0)
			{
				continue;
			}
		}
	}while(1);
	return 0;
}


int  mylookback(const int pos, const int times)
{
	printf("at %d times find pos %d\n",times,pos);
	return 0;
}
int main()
{
	
	int badword[256];  //申明 坏字表空间
	char *substr="hihjkl";   //匹配字串
	char *tarstr="abcdefghihjklmnopqrshihjhihjklkltuhihjklvwxyz";   //查找串
	InitBadWord(badword,(unsigned char *)substr,strlen(substr));    //初始化坏字表
	printf("ret=%d\n",
	bmseek((unsigned char *)tarstr,strlen(tarstr),(unsigned char *)substr,strlen(substr),badword,mylookback));   //查找串
	getchar();
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章