串的模式匹配算法之KMP与BF

2023-11-19

这几天做手机软件, 都不怎么看一些算法小程序了, 同学数据结构作业,急需交,帮其做

/**/ /*
* 文件名:KMP_BF.cpp
* 描述:实验内容:
*       比较BF算法和KMP算法的优劣
*       实验基本要求:
*      1.采用定长顺序显示表示串长的结构来存储串(结构定义见课件第17张幻灯片)
*
*      2.实现BF算法(即朴素算法),BF函数头如下:(参见课件第34张幻灯片)
*        int Index_BF(SString S, SString T) {}// 返回子串T在主串S中第0个字符之后的位置。若不存在,返回-1
*
*       3.实现getnext函数和kmp算法函数,参见课件第58和第53张幻灯片,函数头分别如下:
*         int Index_KMP(SString S, SString T){}//功能同Index_BF 
*         void get_next(SString T, int &next[]){}
*
*       4,编写主函数,分别定义SSsting类型的两个变量,并通过键盘输入串值,并为串设置串长,并分别验证两种匹配算法。
*
*        实验附加要求:
*        修改以上的两种算法函数,使之可以统计字符的比较次数,并最终输出类似以下信息:
*        主串长??,模式串长??
*        BF算法,比较次数为??
*        KMP算法,比较次数为??其中求next值比较的次数为??
*        实验提交要求:
*        实验完成后,提交程序源文件(请务必以学号命名)和包含程序源文件及实验运行结果屏幕截图的word文档(也请务必以学号命名)。  
*创建时间:2007-11-7
*/


#include
< stdio.h >
#include
< stdlib.h >

#define  maxstrlen    256

int  count_BF;
int  count_KMP;
int  count_next;

//  1,采用定长顺序显示表示串长的结构来存储串(结构定义见课件第17张幻灯片)
typedef  struct
... {
    
char ch[maxstrlen];
    
int length;
}
 sstring;

//  2,实现BF算法(即朴素算法)
int  Index_BF(sstring S, sstring T)
... {
    
int i, j, p;
    
    
for(i = 0; i < S.length - T.length + 1; i++)
    
...{
        p 
= i;
        
for(j = 0; j < T.length; j++)
        
...{
            
// 假如不等,跳出循环
            count_BF++;
            
if(S.ch[p] != T.ch[j])
                
break;
            
else
                p
++;
        }

        
if(j == T.length)
            
break;
    }


    
return (j == T.length) ? (p - j) : -1;
}


// 实现getnext函数和kmp算法函数
void  get_next(sstring T,  int   * next)
... {
    
int i, j;

    j 
= -1;
    next[
0= -1;
    i 
= 0
    
while(i < T.length - 1)
    
...{
        
if(j == -1 || T.ch[i] == T.ch[j])
        
...{
            j
++;
            i
++;
            next[i] 
= j;
        }

        
else
            j 
= next[j];

        count_next
++;
    }

}


int  Index_KMP(sstring S, sstring T) // 功能同Index_BF 
... {
    
int i, j;
    
int next[maxstrlen];

    get_next(T, next);

    i 
= 0;
    j 
= 0;
    
while(i < S.length && j < T.length)
    
...{
        
if(j == -1 || S.ch[i] == T.ch[j])
        
...{
            j
++;
            i
++;
        }

        
else
            j 
= next[j];

        count_KMP
++;
    }


    
return (j == T.length) ? (i - j) : -1;
}


int  main()
... {
    sstring S, T;
    
char ch;
    
int v_BF, v_KMP;
    
    S.length 
= 0;
    T.length 
= 0;
    printf(
"请输入主串 S : ");
       while((ch = getchar()) != '/n')
              T.ch[T.length++] = ch;
      T.ch[T.length] = '/0';
       v_BF = Index_BF(S, T);
       v_KMP = Index_KMP(S, T);
      printf("主串为 ==> %s /t| 模式串为 ==> %s/n", S.ch, T.ch);
      printf("主串长 ==> %d /t| 模式串长 ==> %d/n", S.length, T.length);
      printf("BF算法,返回值为 ==> %d /t 比较次数为 ==> %d/n",v_BF, count_BF);
      printf("KMP算法,返回值为 ==> %d    比较次数为 ==> %d    求next值的比较次数为 ==> %d/n", v_KMP, count_KMP, count_next);
      return 0;
}

 在测试程序时发现一个问题:

最后两个printf

 printf("BF算法,返回值为 ==> %d /t 比较次数为 ==> %d/n",v_BF, count_BF);
 printf("KMP算法,返回值为 ==> %d    比较次数为 ==> %d    求next值的比较次数为 ==> %d/n", v_KMP, count_KMP, count_next);

之前写成这样的:

 printf("BF算法,返回值为 ==> %d /t 比较次数为 ==> %d/n",Index_BF(S, T), count_BF);
 printf("KMP算法,返回值为 ==> %d    比较次数为 ==> %d    求next值的比较次数为 ==> %d/n", Index_KMP(S, T), count_KMP, count_next);

发现输出的count_BF,count_KMP,count_next值总是0;后来改在printf前面调用Index_BF(),Index_KMP()两个函数; 三个count 值才能正常输出.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

串的模式匹配算法之KMP与BF 的相关文章

随机推荐

  • ValueError: PyCapsule_GetPointer called with incorrect name

    ValueError PyCapsule GetPointer called with incorrect name解决问题的方式 增高pyqt5的版本 增高pyqt5的版本 我遇到了这个问题的时候在网上查的一直是说需要降低pyqt5的版本
  • 嵌入式开发linux控制鼠标,嵌入式系统/ARM技术中的linux中如何使用微软鼠标的第4、5键...

    虽说使用linux的人大都对微软没什么好感 但不能否认微软确实也出了不少好东西呀 比如微软鼠标 IE系列 icon smile gif IE 2 0和以上版本都有5个按钮 除了正常的左中右外 两侧还各有一个 在windows中可用来支持浏览
  • 面试题之你对redis的认识

    这里是我自己看书对redis的总结 这次我们目标的Redis在java互联网项目网中的作用 在传统的javaweb项目中 使用数据库进行存储数据 但是有一些致命的弊端 主要来自性能方面 由于数据库持久化数据主要是面向磁盘 而磁盘的读 写比较
  • yarn-container的理解

    不管是MR还是spark 分布式并行计算是肯定的 分布式计算意味着多节点 每个节点必须要并行跑很多task 任务 因为如果一个节点只有一个task 那么节点数量远远不够 让开发者直接操作 cpu和内存显然不合理 要用container抽象
  • 用户在输入不符合格式要求的内容或出现多个小数点时,无法继续输入新内容,但仍然可以使用后退键进行修正

  • 美国大学生数学建模竞赛赛题特点

    美国大学生数学建模竞赛赛题特点 赛题灵活度高 内容广泛 反恐 防灾 环境 健康医疗 交通 新能源等等 开放性大 评价类问题多且复杂 离散型优化问题多 除A题 如 2016B太空碎片的处理 2018D电动车充电桩的优化 2019D卢浮宫疏散路
  • 重要通知:9月1日起,微信小程序须完成备案后才可上架

    微信官方通知 近日 工信部发布了 工业和信息化部关于开展移动互联网应用程序备案工作的通知 8月9日 微信公众平台也发布了 关于开展微信小程序备案的通知 一 备案必要性 在中华人民共和国境内从事互联网信息服务的移动互联网应用程序主办者 应当依
  • ArduCopter调试

    1 ArduPilot main 我们知道 在 C语言中最经典的程序是 Hello World 这应该是我们在 C语言中最早接触的一个程序了 而在单片机中 最经典的一个程序当属 LED了 那么这里我们为什么不去分析 Hello World
  • 使用嵌入式linux完全手册光盘的arm-linux-gcc 遇到问题 自己编译

    Redhat9下重新生成交叉编译器gcc 3 4 5 glibc 2 3 6 看到论坛上有兄弟也遇到 arm linux gcc lib tls libc so 6 version GLIBC 2 4 not found required
  • 鸿蒙手机录音,录音应用的隐藏功能,90%的人不知道?

    录音应用的隐藏功能 90 的人不知道 2019 04 22 16 57 20 1点赞 0收藏 0评论 录音应用其实隐藏着可以自动开始和结束 脱离手用蓝牙耳机录音 只在说话时录音 你使用过吗 这款录音应用可是被苹果App Store推荐过的
  • 从零开始:在腾讯云轻量服务器上安装Docker,实现快速开发和部署!

    本文指导您如何在 零基础轻量应用服务器上安装 Docker 以及使用 Docker 镜像源加速镜像下载 好了 没有废话 让我们开始行动吧 第一步 购买服务器 小编买的是 腾讯的 1年446RMB 下载链接如下 学生云服务器 学生云主机 学生
  • 可靠数据传输的实现

    可靠数据传输协议 我们知道 TCP和UDP都是基于IP网际协议来传输数据的 但是IP网际协议是一种不可靠数据传输协议 它不负责数据丢失等情况 而TCP是一种可靠数据传输 因此我们需要来关注TCP是如何实现可靠数据传输的 经完全可靠信道的可靠
  • wxc-button使用

  • 怎么理解回流跟重绘?什么场景下会触发?

    目录 一 什么是回流 下面这些操作会导致回流 二 什么是重绘 下面这些操作会导致重绘 除此之外还有一些其他引起重绘行为 三 如何避免回流与重绘 减少回流与重绘的措施 一 什么是回流 当渲染树中部分或者全部元素的尺寸 结构或者属性发生变化时
  • 多编程语言代码生成神器 CodeGeeX,编码效率提升十倍!

    点击上方 芋道源码 选择 设为星标 管她前浪 还是后浪 能浪的浪 才是好浪 每天 10 33 更新文章 每天掉亿点点头发 源码精品专栏 原创 Java 2021 超神之路 很肝 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网
  • 物理端口UP 协议DOWN 的排错步骤

    端口的物理层Up 但是协议Down 可能的原因有很多种 一般而言 链路层协议从 初始化到Up 起来 都会经过一个协议的 协商 过程 这里所说的协商是广义上的协商 既包括链路层协议本身规定的参数 能力协商 也包括协议所规定的定期性的链路通达性
  • Drupal YAML 反序列化代码执行漏洞(CVE-2017-6920)

    事件背景 框架漏洞收集 老外的CMS框架 比较复杂 数据流向太长 调试需要消耗较多的时间 漏洞说明 1 漏洞原理 2017年6月21日 Drupal官方发布了一个编号为CVE 2017 6920 的漏洞 影响为Critical 这是Drup
  • maven 仓库配置 pom中repositories属性

    什么是Maven仓库 在不用Maven的时候 比如说以前我们用Ant构建项目 在项目目录下 往往会看到一个名为 lib的子目录 那里存放着各类第三方依赖jar文件 如log4j jar junit jar等等 每建立一个项目 你都需要建立这
  • python实现二叉树遍历

    使用python实现二叉树的四种遍历 前序 中序 后序和层次遍历 以遍历下图二叉树为例 1 树的构造 代码如下 coding utf 8 class Node object 节点类 def init self elem 1 lchild N
  • 串的模式匹配算法之KMP与BF

    这几天做手机软件 都不怎么看一些算法小程序了 同学数据结构作业 急需交 帮其做 文件名 KMP BF cpp 描述 实验内容 比较BF算法和KMP算法的优劣 实验基本要求 1 采用定长顺序显示表示串长的结构来存储串 结构定义见课件第17张幻