首先声明:BF和KMP算法是刁肥宅自己实现的,BM算法源自此处,刁肥宅未曾妄加改动,只是作测试用。操作系统及硬件配置信息如图6所示,刁肥宅所用编译环境为:Code::Blocks 17.12、VC6.0(完整绿色版)。所用源代码与测试数据都已上传到百度云盘(提取密码:dhu0)与CSDN“我的资源-下载”上,各位看官可以免费下载亲测。
话不多说,先贴出三个算法的C语言实现:
注:KMP算法实现有问题,实验结果有差错。但年代久远,没有心思改了。——2020.11.02
一、算法实现
1.BF模式匹配算法
头文件BF.c:
/*Bf.h*/
#ifndef BF_H_INCLUDED
#define BF_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <malloc.h>
int Find( char *T, int T_Length,char *P, int P_Length );
#endif /* BF_H_INCLUDED*/
源文件BF.c:
/*BF.c*/
#include "BF.h"
int Find( char *T, int T_Length,char *P, int P_Length )
{
/*在目标串T中从第0个字符开始寻找模式串P在T中匹配的位置。若在T中找不到与
串P匹配的子串, 则函数返回-1, 否则返回P在T中第一次匹配的位置。*/
int i, j, k; /*last为在T中最后可比对位置*/
/*printf( "In Find,T_Length = %d, P_Length = %d\n", T_Length, P_Length );*/
/*for ( i = 0; i <= strlen(T) - strlen(P); i++)*/
for ( i = 0; i <= T_Length - P_Length; i++ )/*逐趟比对*/
{
for ( k = i, j = 0; j < P_Length; k++, j++ ) /*从T.ch[i]开始与P.ch进行比对*/
if ( *( T + k ) != *( P + j ) )
break; /*比对不等跳出循环*/
if ( j == P_Length )
return i + 1; /*P已扫描完, 匹配成功*/
}
return -1; /*匹配失败*/
}
源文件test.c:
/*test.c*/
#include "BF.h"
int main()
{
/*freopen("x1.out","w",stdout);*/
srand( time(NULL) );
char *T = NULL,*P = NULL;
FILE *fp1 = fopen("x1.in","r");
if( fp1 == NULL )
{
printf("Opening Error.\n");
exit(EXIT_FAILURE);
}
int i,d,ChoosingKey = 0,Value = 0,T_Length,P_Length,RandomSize = 1000001430;
T = ( char * )malloc( sizeof(char) * RandomSize );
P = ( char * )malloc( sizeof(char) * 34 );
/*strcpy(P,"wOvT5jN9154gQ751sK9eH1I1l0Hgf9d");*/
strcpy(P,"fsf8QQCNlL80s1ouGx2TeANoH2jxx9SYQ");
for( i = 0;!feof(fp1);i ++ )
fscanf( fp1,"%c",(T + i) );
P_Length = ( strlen(P) );
T_Length = ( strlen(T) );
/*
for( i = 0;i < RandomSize;i ++ )
{
ChoosingKey = rand() % 3 + 1;
switch(ChoosingKey)
{
case 1:
Value = rand() % ( 90 - 65 + 1 ) + 65;
*( T + i ) = (char)Value;
break;
case 2:
Value = rand() % ( 122 - 97 + 1 ) + 97;
*( T + i ) = (char)Value;
break;
case 3