rabin-karp二维字符数组匹配

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

void two_d_rabin_karp_matcher(char **T,int n1,int n2,char **P,int m1,int m2,int d,int q)//二维模式匹配
{
	int *pattern=new int[m2];
	int *text=new int[n2];
	for(int i=0;i<m2;++i){//将2维模式转换为1维
		pattern[i]=0;		
		for(int j=0;j<m1;++j){
			pattern[i]=(d*pattern[i]+P[j][i])%q;
		}
	}
	for(int i=0;i<n2;++i){//列数
		text[i]=0;
		for(int j=0;j<m1;++j){//和模式行数一样
			text[i]=(d*text[i]+T[j][i])%q;
		}
	}

	int h=static_cast<int>(pow(d*1.0,m2-1))%q;
	int p=0;
	int t=0;
	for(int i=0;i<m2;++i){//将一维数组转换成单元素值
		p=(d*p+pattern[i])%q;
		t=(d*t+text[i])%q;
	}
	delete []pattern;
	for(int he=0;he<=n1-m1;++he){//T数组的行
		if(he<=n1-m1 && he>0){
			for(int c=0;c<n2;++c){
				int th=(T[he-1][c]*h)%q;
				int t_th=text[c]-th;
				while(t_th<0){
					t_th+=q;
				}
				t_th=(t_th*d)%q;
				t_th=t_th+T[he+m1-1][c];
				text[c]=t_th%q;
			}
			t=0;//初始值为0
			for(int i=0;i<m2;++i){//将一维数组转换成单元素值
				t=(d*t+text[i])%q;
			}
		}
		for(int w=0;w<=n2-m2;++w){
			if(p==t){
				int i=0,j=0;
				bool flag=false;//判断是否存在不相等的情况
				for(i=0;i<m1;++i){
					if(flag){
						break;
					}
					for(j=0;j<m2;++j){
						if(P[i][j]!=T[he+i][w+j]){
							flag=true;
							break;
						}
					}
				}
				if(!flag){
					cout<<"pattern occurs with shift ("<<he<<" , "<<w<<") "<<endl;
				}
			}	
			if(w<n2-m2){//利用霍纳法则计算下一个值
				//Ts+1=(d(Ts-T[s+1]h)+T[s+m+1])mod q
				int ts=(text[w]*h)%q;
				int t_ts=t-ts;
				while(t_ts<0){
					t_ts+=q;
				}
				t_ts=(t_ts*d)%q;
				t=t_ts+text[w+m2];
				t=t%q;
			}
		}
	}
	
	delete []text;
}


int main()
{
	int n1=5,n2=5,m1=2,m2=2;
	char text[5][5] = {
                       { 'a', 'b', 'a', 'b', 'a' },
                       { 'a', 'b', 'a', 'b', 'a' },
                       { 'a', 'b', 'b', 'a', 'a' },
                       { 'a', 'b', 'a', 'a', 'b' },
                       { 'b', 'b', 'a', 'b', 'a' }};
	char **pt=new char *[n1];
	for(int i=0;i<n1;++i){
		pt[i]=new char[n2];
		for(int j=0;j<n2;++j){
			pt[i][j]=text[i][j];
		}
	}

   char pattern[2][2] = {
					   { 'a', 'b' },
					   { 'a', 'b' }};

   char **pp=new char *[m1];
   for(int i=0;i<m1;++i){
		pp[i]=new char[m2];
		for(int j=0;j<m2;++j){
			pp[i][j]=pattern[i][j];
		}
   }
	int d=10;
	int q=13;
	two_d_rabin_karp_matcher(pt,5,5,pp,2,2,d,q);

	for(int i=0;i<n1;++i){
		delete[]pt[i];
	}
	delete[]pt;
	for(int i=0;i<m1;++i){
		delete [] pp[i];
	}
	delete [] pp;
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值