比较BF、KMP和BM算法的性能(纯C语言实现,而且……VC6.0编译的程序跑得比codeblocks 17.12编译的快)

本文对比了BF、KMP和BM三种模式匹配算法的性能,并提供了C语言实现。作者指出KMP算法存在错误,未进行修正。测试结果显示,BM算法效率最高,BF次之,KMP最低。此外,作者发现VC6.0编译的程序运行速度超过Code::Blocks 17.12。所有源代码和测试数据均可下载验证。
摘要由CSDN通过智能技术生成

       首先声明: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
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值