#include <stdio.h>
#include <math.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define d 256
#define PRIME 127
#define MULTIPLER 0x015A4E35L
#define INCREMENT 1
int seed;
void random_seed(int b)
{
if(b==0)
seed=time(0);
else
seed=b;
}
int random(int low,int high)
{
seed=MULTIPLER*seed+INCREMENT;
return ((seed>>16)%(high-low)+low);
}
void RABIN_KARP_MATCHER(char *T,char*P)
{
int M = strlen( P );
int N = strlen( T );
/**********此处计算小于r的素数的集合R[],以及集合中的元素个数K*************/
int R[1000];
int k=2,i,j,flag,r;
R[0]=2,R[1]=3;
flag=0;
r=12*M*N*N;
for(i=2;i<r;i++) //判断小于r的素数存放于数组R[],并以k记录数组的个数
{
for(j=2;j<=sqrt(i);j++)//判断一个数是否为素数
{
if(i%j!=0)
{
flag=1;
continue;
}
else
{ flag=0;
break;
}
}
if(flag==1)
{
R[k]=i;
k++;
}
}
int q;
random_seed(0);
q=random(1,k);//随机抽取k个素数中的其中一个
q=R[q];//获取R下表为q的的素数
/******此处开始模式匹配*********/
assert(T&&P&&q >0 );
int p = 0;//pat的哈希值
int t = 0;//txt的哈希值
int h = 1;
for(i=0;i < M - 1; i++)
h = (h*d)% q;
for( i = 0; i < M; i++ )
{
p = ( d * p + P[i] ) % q;
t = ( d * t + T[i] ) % q;
}
for( i = 0; i <= N - M; i++)
{
if( p == t)
{
for( j = 0; j < M; j++)
if(T[i+j] != P[j])
break;
if( j == M )
printf("匹配串的起始位置为: %d\n", i+1);
}
//计算移动窗口
if( i< N - M )
{
t = ( d * ( t - T[i] * h ) + T[i + M] ) % q;
if( t < 0 )
t+=q;
}
}
}
int main(int argc, char* argv[])
{ char txt[1000],pat[1000];
printf("请输入字符串:\n");
gets(txt);
printf("请输入所要匹配的模式串:\n");
gets(pat);
RABIN_KARP_MATCHER(txt,pat);
return 0;
}
RK字符串匹配随机算法(C语言)
最新推荐文章于 2021-05-24 02:58:15 发布