数据结构历年考研真题对应知识点(串的模式匹配)

目录

4.2串的模式匹配

4.2.2串的模式匹配算法——KMP算法

【KMP 匹配过程中指针变化的分析(2015)】

【KMP 匹配过程中比较次数的分析(2019)】 


4.2串的模式匹配

4.2.2串的模式匹配算法——KMP算法

KMP 匹配过程中指针变化的分析(2015)】

最终得到子串指针变化公式 j=next[ j ]。在实际匹配过程中,子串在内存中是不会移动的,而是指针发生变化,画图举例只是为了让问题描述得更形象。next[ j ]的含义是:当子串的第 j 个字符与主串发生失配时,跳到子串的 next[ j ]位置重新与主串当前位置进行比较

如何推理 next 数组的一般公式?设主串为's_{1}s_{2}...s_{n}',模式串为'p_{1}p_{2}...p_{m}',当主串中第 i 个字符与模式串中第 j 个字符失配时,子串应向右滑动多远,然后与模式中的哪个字符比较?

假设此时应与模式串的第k(k<j)个字符继续比较,则模式串中前 k-1 个字符的子串必须满足下列条件,且不可能存在 k'>k 满足下列条件:

p_{1}p_{2}...p_{k-1}=p_{j-k+1}p_{j-k+2}...p_{j-1}

若存在满足如上条件的子串,则发生失配时,仅需将模式串向右滑动至模式串的第k个字符和主串的第i个字符对齐,此时模式串中的前k-1 个字符的子串必定与主串中第i个字符之前长度为 k-1 的子串相等,由此,只需从模式串的第k个字符与主串的第i个字符继续比较即可,如图 4.5 所示。

当模式串已匹配相等序列中不存在满足上述条件的子串时(可视为 k=1),显然应该将模式串右移 j-1 位,让主串的第 i 个字符和模式串的第1个字符进行比较,此时右移位数最大。

当模式串的第1个字符(j=1)与主串的第i个字符发生失配时,规定 next[1]=0(可理解为将主串的第i个字符和模式串的第1个字符的前面空位置对齐,即模式串右移一位。)将模式串右移一位,从主串的下一个位置(i+1)和模式串的第1个字符继续比较。

通过上述分析可以得出 next 函数的公式:

上述公式不难理解,实际做题求 next 值时,用之前的方法也很好求,但要想用代码来实现,貌似难度还真不小,我们来尝试推理求解的科学步骤。
首先由公式可知                

next[1]=0

设 next[j]=k,此时k应满足的条件在上文中已描述。
此时 next[ j+1 ]=?可能有两种情况:
(1)若p_{k}=p_{j},则表明在模式串中

p_{1}...p_{k-1}p_{k}=p_{j-k+1}...p_{j-1}p_{j}

并且不可能存在 k'>k 满足上述条件,此时 next[ j+1 ]=k+1,即 next[ j+1 ] = next[ j ]+1

(2)若p_{k}\neq p_{j},则表明在模式串中

p_{1}...p_{k-1}p_{k}\neq p_{j-k+1}...p_{j-1}p_{j}

此时可将求 next 函数值的问题视为一个模式匹配的问题。用前缀 p_{1}...p_{k}去与后缀 p_{j-k+1}...p_{j}匹配,当 p_{k}\neq p_{j}时,应将p_{1}...p_{k}向右滑动至以第 next [k]个字符与p_{j}比较,若 p_{next[k]}p_{j}仍不匹配,则需要寻找长度更短的相等前后缀,下一步继续用 p_{next[next[k]]}p_{j}比较,以此类推,直到找到某个更小的 k'=next[next… [k]](1<k'<k<j),满足条件

p_{1}...p_{k}=p_{j-k'+1}...p_{j}

则 next [ j+1 ]=k'+1

也可能不存在任何 k'满足上述条件,即不存在长度更短的相等前缀后缀,令 next[ j+1 ]=1

理解起来有一点费劲?下面举一个简单的例子。

图 4.6的模式串中已求得6个字符的next值,现求 next [7],因为next[ 6 ]=3,又p_{6}\neq p_{3}则需比较p_{6}p_{1 }(因next[ 3 ]=1),由于p_{6}\neq p_{1},,而next[1]=0,因此

next [7]=1;求next [8],因p_{7}=p_{1},则next [8]=next [7]+1=2;求next [9],因p_{8}=p_{2},则 next [9]=3。

通过上述分析写出求 next 值的程序如下:

void get_next(SString T,int next[]){
    int i=1,j=0;
    next[1]=0;
    while(i<T.length){
        if(j==0||T.ch[i]==T.ch[j]){
            ++i; ++j;
            next[i]=j;    //若pi=pj,则 next[j+1]=next[j]+1
        }
        else
            j=next[j];    //否则令j=next[j],循环继续
    }
}

计算机执行起来效率很高,但对于我们手工计算来说会很难。因此,当我们需要手工计算时还是用最初的方法。

与 next 数组的求解相比,KMP 的匹配算法相对要简单很多,它在形式上与简单的模式匹配算法很相似。不同之处仅在于当匹配过程产生失配时,指针i不变,指针 j退回到 next[j]的位置并重新进行比较,并且当指针j为0时,指针i和j同时加 1。即若主串的第i个位置和模式串的第1个字符不等,则应从主串的第 i+1个位置开始匹配。具体代码如下:

int Index_KMP(SString S,SString T,int next[]){
    int i=1,j=1;
    while(i<=S.length && j<=T.length){
        if(j==0||S.ch[i]==T.ch[j]){
            ++i; ++j;         //继续比较后继字符
        }
        else
            j=next[j];        //模式串向右移动
    }
    if(j>T.length)
        return i-T.length;    //匹配成功
    else
        return 0;
}

KMP 匹配过程中比较次数的分析(2019)】 

尽管普通模式匹配的时间复杂度是 O(mn),KMP 算法的时间复杂度是 O(m+n),但在一般情况下,普通模式匹配的实际执行时间近似为 0(m+n),因此至今仍被采用。KMP 算法仅在主串与子串有很多“部分匹配”时才显得比普通算法快得多,其主要优点是主串不回溯

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/755244.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Dahlia Hart: Stylized Casual Character(休闲角色模型)

此包包含两个发型和两个服装&#xff0c;每个都有多种颜色选择。每个发型都适合与物理资源一起使用&#xff0c;并包含各种表情和音素混合形状。 下载&#xff1a;​​Unity资源商店链接资源下载链接 效果图&#xff1a;

OBD诊断(ISO15031) 02服务

文章目录 功能简介请求和响应1、read-supported PIDs1.1、请求1.2、肯定响应 2、read PID value1.1、请求1.2、肯定响应 3、同时请求多个PID4、同时读取多个PID数据 Parameter definition报文示例1、单个PID请求和读取2、多个PID请求和读取 功能简介 02服务&#xff0c;即 Req…

基于CNN卷积神经网络的步态识别matlab仿真,数据库采用CASIA库

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1步态识别系统框架 4.2 CNN原理及数学表述 4.3 CASIA步态数据库 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 1.训练过程 2.样本库 3.提取的步态能量图 4.步态识…

李商隐,情丝绕指的朦胧诗人

李商隐&#xff0c;字义山&#xff0c;号玉谿生、樊南生&#xff0c;约生于唐宪宗元和八年&#xff08;公元813年&#xff09;&#xff0c;卒于唐宣宗大中十二年&#xff08;公元858年&#xff09;&#xff0c;享年45岁。李商隐生活在晚唐时期&#xff0c;与杜牧合称“小李杜”…

【51单片机入门】矩阵键盘

文章目录 前言矩阵键盘介绍与检测原理原理图代码讲解总结 前言 在嵌入式系统设计中&#xff0c;键盘输入是一种常见的人机交互方式。其中&#xff0c;矩阵键盘因其简单、方便和易于扩展的特性&#xff0c;被广泛应用于各种设备中。本文将介绍如何使用51单片机来实现矩阵键盘的…

微机原理与接口技术:重点内容|计算机系统|学习笔记

系列目录 前言 只将最重要的知识点考点列出来方便学习复习 目录 系列目录前言第1章 微型计算机概述第2章 16位和32位微处理机&#x1f31f;16位微处理器 8086 第3章 Pentium 的指令系统常用指令 第4章 存储器、存储管理和高速缓存技术第5章 微型计算机和外设的数据传输第6章 串…

Java学习 - 布隆过滤器

前置需求 需求 已经有50亿个电话号码&#xff0c;现在给出10万个电话号码&#xff0c;如何快速准确地判断这些电话号码是否已经存在&#xff1f; 参考方案 通过数据库查询&#xff1a;比如MySQL&#xff0c;性能不行&#xff0c;速度太慢将数据先放进内存&#xff1a;50亿*8字…

vue3-openlayers 图标闪烁、icon闪烁、marker闪烁

本篇介绍一下使用vue3-openlayers 图标闪烁、icon闪烁、marker闪烁 1 需求 图标闪烁、icon闪烁、marker闪烁 2 分析 图标闪烁、icon闪烁、marker闪烁使用ol-animation-fade组件 3 实现 <template><ol-map:loadTilesWhileAnimating"true":loadTilesWh…

龙迅#LT6911GXC支持HDMI2.1转MIPI/4PORT LVDS应用功能,分辨率高达8K30HZ/4K120HZ压缩格式。

1. 描述 该LT6911GXC是一款高性能HD-DVI2.1转MIPI或LVDS芯片&#xff0c;适用于VR/显示应用。 HDCP RX作为HDCP中继器的上游&#xff0c;可以与其他芯片的HDCP TX配合实现中继器功能。 对于 HD-DVI2.1 输入&#xff0c;LT6911GXC可以配置为 3/4 通道。 对于MIPI输出&#xff0c…

推荐一款免费的GIF编辑器——【ScreenToGif编辑器】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️木道寻的主页 文章目录 &#x1f525;前言&#x1f680;素材准备&#x1f680;逐帧制作&#x1f680;保存图片⭐️⭐️⭐️总结 &#…

PPT中的文字跟随Excel动态变化,且保留文字格式

今天协助客户解决了一个有趣的问题&#xff0c;这里记录一下&#xff0c;以此共勉。 目录 1. 提出问题2. 此功能的应用场景3. 开始制作4. 注意事项5. 若遇到任何问题 1. 提出问题 PPT的图表是可以引用Excel的&#xff0c;那PPT的文本是否可以引用Excel实现动态更新呢&#xff…

农业新质生产力数据(2012-2022年)原始+dofile+测算数据集

数据简介&#xff1a;农业新质生产力是指在现代农业发展中&#xff0c;通过融合尖端科技、信息技术与创新管理模式&#xff0c;实现农业生产效率飞跃、产品质量显著提升及生产可持续性增强的一种革新性生产能力&#xff0c;农业新质生产力代表了从依赖传统资源转向依靠科技创新…

中科驭数CEO鄢贵海:从计算系统的三个视角重新审视DPU的核心价值

在信息技术日新月异的浪潮中&#xff0c;DPU正逐渐崭露头角。当前&#xff0c;DPU发展的核心驱动力来自于什么&#xff1f;DPU技术是否已经足够成熟到广泛应用&#xff1f;市场上头部玩家参与到这一创新技术的市场角逐之中&#xff1f;在算力时代&#xff0c;DPU应该如何找准价…

k8s流控平台apiserver详解

一、简单理解认识apiserver 1.主要功能 认证 鉴权 准入 mutating validating admission 限流 2.概念 apiserver保护etcd&#xff0c;缓存机制&#xff0c;有缓存直接返回&#xff0c;没缓存再去查看etcd,apiserver是担任和其他平台同信并认证 3.访问控制概览…

[linux]sed命令基础入门详解

sed是一种流编辑器&#xff0c;它一次处理一行内容。处理时&#xff0c;把当前处理的行存储在临时缓冲区中&#xff0c;称为“模式空间”&#xff0c;接着用sed命令处理缓冲区中的内容&#xff0c;处理完成后&#xff0c;把缓冲区的内容送往屏幕。接着处理下一行&#xff0c;这…

ROS2开发机器人移动

.创建功能包和节点 这里我们设计两个节点 example_interfaces_robot_01&#xff0c;机器人节点&#xff0c;对外提供控制机器人移动服务并发布机器人的状态。 example_interfaces_control_01&#xff0c;控制节点&#xff0c;发送机器人移动请求&#xff0c;订阅机器人状态话题…

PHP电商系统开发指南数据库管理

回答&#xff1a;数据库管理是电商系统开发的关键&#xff0c;涉及数据的存储、管理和检索。选择合适的数据库引擎&#xff0c;如mysql或 postgresql。创建数据库架构&#xff0c;定义数据的组织方式&#xff08;如产品表、订单表&#xff09;。进行数据建模&#xff0c;考虑实…

Vue-cli项目及Element UI 环境搭建 保姆级教程

一、Vue-cli介绍及其作用 什么是Vue-cli手脚架 vue-cli 官方提供的一个脚手架&#xff0c;用于快速生成一个 vue 的项目模板&#xff1b;预先定义 好的目录结构及基础代码&#xff0c;就好比咱们在创建 Maven 项目时可以选择创建一个 骨架项目&#xff0c;这个骨架项目就是脚…

DAY17-力扣刷题

1.相同的树 100. 相同的树 - 力扣&#xff08;LeetCode&#xff09; 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 class Solution {public…

文心一言4.0免费使用

领取&安装链接&#xff1a;Baidu Comate 领取季卡 有图有真相 原理&#xff1a;百度comate使用文心一言最新的4.0模型。百度comate目前免费使用&#xff0c;可以借助comate达到免费使用4.0模型目的。 如何获得 点击「Baidu Comate 领取季卡 -> 领取权益」&#xff0…