KMP算法

云风coroutine源码分析 前言 现在C++的开发开始流行使用coroutine,也就是协程。我看腾讯的几个开源项目里面都有协程的实现。使用协程可以用同步的写法,达到异步的性能。它的基本原理其实就是在IO等待的时候切换出去,在适当的时刻再切换回来。云风用200行代码实现了一个最简单的协程,我们先看这个代码了解一下协程的原理,然后再看微信的libco实现。 协程简单介绍 协程可以理解为一个用户级的线程,一个线程里跑多 阅读详情

欢迎前往个人博客 驽马点滴 和视频空间 哔哩哔哩-《挨踢日志》

 

先引几篇看过的文章:

 

http://blog.youkuaiyun.com/v_july_v/article/details/6545192

 

http://blog.youkuaiyun.com/v_july_v/article/details/7041827

 

http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html

 

里面介绍得不错。

KMP算法的关键在于next[j]函数,明白了这个,才会真正掌握KMP算法。

这里只想写写自己对next[j]函数的分析。

 

【问题背景】S中寻找子串P

【关键】求出P的next[j]函数

  1. k=next[j]函数表示的意思首先要明白: 在S[i]与P[j]不匹配的时候,S[i]继续和P中的项P[k]进行匹配(当然k!=-1);
  2. k=next[j]函数蕴含的意思也要明白:P[0:k-1]和P[j-k:j-1]是相互匹配的最长子串;

 

弄明白以上两点,一切问题迎刃而解:

我们的目的不就是已知0:j时的next[j]求next[j+1]吗?

那么先令k=next[j];且假设S[i+1]不匹配P[j+1],下面求next[j+1]。

考虑

  1. P[j]==P[k], 那么在加上已知的【关键】2 我们知道 P[0:k]和P[j-k:j]匹配,但此时,我们还关心P[j+1]和P[k+1]是否相等:
    1. 如果P[j+1]!=P[k+1],意味着P[0:k]和P[j-k:j]这是最长的匹配子段,那么S[i+1]下一个需要进行匹配的项是P[k+1],即知道next[j+1]=k+1;
    2. 如果P[j+1]==P[k+1],而已知S[i+1]!=P[j+1],那么有S[i+1]!=P[k+1],于是S[i+1]就不需要和P[k+1]进行比较(但是我们知道S[i-k:i]和P[0:k]是相互匹配的(S[i-j:i]和P[0:j]匹配,再加上下滑线的部分: P[0:k]和P[j-k:j]匹配 可得)),于是由于S[i+1]不匹配P[k+1]而需要“更改下一个匹配项”,而这个匹配项,按照定义即next[k+1],因此next[j+1]=next[k+1];
  2. P[j]!=P[k],那么首先由【关键】2得 P[0:k-1]和P[j-k:j-1]是相互匹配的,但是下一项P[k]和P[j]不匹配,看到了吗?如果把P[0:k]看成子串P',把P[0:j]看成S',那么此时j项不匹配k项的时候,j项下一个去匹配的应该是哪项?对了,是next[k](因此要让k=next[k],回到1.,目的是使得P[j]==P[k],这样,才能求出next[j+1]);

这就是整个next[j+1]函数的由来.

代码看看今晚能不能自己写出来。

 

#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;

void GetNext(char const* p, int plength, int* next)
{
    int j = 0;
    int k = -1;
    next[j]=-1;
    while(j<plength-1)
    {
        if(k==-1||p[j]==p[k])
        {
            ++j;
            ++k;
            if(p[j]!=p[k])
            {
                next[j]=k;
            }
            else
            {
                next[j]=next[k];
            }
        }
        else
        {
            k = next[k];
        }
    }

}
int KMPAlgorithm(char const* s, int slength, char const* p, int plength,int* next)
{
    int i=0;
    int j=0;
    while(i<slength&&j<plength)
    {
        if(j==-1||s[i]==p[j])
        {
            ++i;
            ++j;
        }
        else
        {
            j=next[j];
        }
    }
    if(j>=plength)
    {
        return i-plength;
    }
    else
    {
        return -1;
    }
}
int _tmain(int argc, _TCHAR* argv[])
{
    string sstring = "aabbacbcabababbababccc";
    string pstring = "ababc";
    int* next = new int [pstring.size()];
    GetNext(pstring.data(),pstring.size(),next);
    for(int i=0;i<pstring.size();i++)
    {
        cout<<next[i]<<"\t";
    }
    cout<<endl;
    int kmpResult = KMPAlgorithm(sstring.data(),sstring.size(),pstring.data(),pstring.size(),next);
    cout<<"返回值"<<kmpResult<<endl;
    cout<<"子串为:"<<sstring.substr(kmpResult,pstring.size())<<endl;
    system("pause");
    delete[] next;
    return 0;
}

 

 

欢迎前往个人博客 驽马点滴 和视频空间 哔哩哔哩-《挨踢日志》

 

 

KMP算法详解 文章目录KMP算法前置知识串的基本概念C++C++C++中stringstringstring库的函数KMP核心算法—next数组KMP匹配next数组计算例题KMP算法改进其他字符串知识点计算最长前缀后缀计算循环节补充字符使原字符串变为循环串 KMP算法 ​ KMPKMPKMP算法是字符串匹配中的一个较好的算法,它的目的是在给定一个模式串ppp和原字符串qqq中,找到ppp在qqq中第一次出现的位置。 ​ 如上图所示,可以很简单的看出字符串ppp在字符串qqq中第一次出现的位置,如果位置从1开始计算的话 阅读详情

相关推荐

【KMP算法详解——适合初学KMP算法的朋友】

KMP算法的初级体验,只为抛砖引玉之用

Bill_Hoo的专栏 2756

KMP及其改进算法

本文主要讲述KMP已经KMP的一种改进方法。若发现不正确的地方,欢迎交流指出,谢谢! KMP算法的基本思想: KMP的算法流程: 每当一趟匹配过程中出现字符比较不等时,不需回溯 i 指针,而是利用已经得到的部分匹配的结果将模式向右滑动尽可能远的一段距离后,继续进行比较。 设S为目标串,T为模式串,设 i 指针和 j 指针分别指示目标串和模式串中正待比较的字符。 开始时

AutoVision (by 仙道菜) 4588

模拟ic入门——设计一个单极运放(一)单级运算放大器设计基础

主要介绍了单级运放的基本理论和使用场景

qq_64956710的博客 3743

图解算法:KMP算法

目录第一章 暴力匹配实现第二章 KMP算法介绍第三章 KMP算法原理第四章 KMP的匹配表第五章 KMP算法实现 项目地址:https://gitee.com/caochenlei/algorithms 第一章 暴力匹配实现 【问题描述】 有一个字符串 str1 = “BBC ABCDAB ABCDABCDABDE”,和一个子串 str2 = “ABCDABD”,现在要判断 str1 是否含有 str2,如果存在,就返回第一次出现的位置,如果不存在,就返回-1。 【问题思路】 【代码实现】 publ

轻松的小希 8311

均匀分布产生高斯分布

均匀分布产生高斯分布 文章目录均匀分布产生高斯分布简介方法和证明代码效果引用 简介 方法和证明 代码 效果 引用

gy_Rick的博客 5317

华为AC外置Portal认证方案配置步骤指南

华为AC外置Portal认证方案配置步骤指南

m0_46129105的博客 7673

kmp算法总结

搞ACM也有三年了,期间学习了不少算法,到12月把上海站打完也要成退役狗了。最近突然想把学过的一些算法回过头来好好总结一下,于是就有了我的算法总结系列。这是这个系列的开端,所以先写一个简单点的算法,以后会慢慢复习一些复杂的算法,最后还是希望自己能够坚持下去吧。 KMP算法 KMP算法是一种线性时间复杂度的字符串匹配算法,它是对BF(Brute-Force,最基本的字符串匹配算法)的改进。对

ddyyxx的程序员之路 1万+

UG/NX二次开发Siemens官方NXOPEN实例解析—1.3 BlockStyler/ExtrudewithPreview

随着工业智能化的不断发展,UG二次开发的需求越来越多,也吸引了大批的二开从业人员,本人作为一名资深IT从业者(10年+)也毅然加入二次开发大军。然而,和流行IT行业(互联网、金融、医疗等)相比,工业智能化的门槛显得更高一点,专业的工业软件,相对封闭的开发理念和更小的开发圈子,让刚进入二开的从业者有点举步维艰。边学边整理,希望通过这系列文章的整理能给二开的生态增添一叶绿。

MarcoPro的博客 1633

kmp算法详解

从头到尾彻底理解KMP 此文转自神的博客  http://blog.youkuaiyun.com/v_july_v/article/details/7041827# 作者:July 时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文,随后的半个多月不断反复改进。后收录于新书《编程之法:面试和算法心得》第4.4节中。 1. 引言     本KMP原文最初写于2

楠先生 4万+

PyTorch深度学习实战(47)——使用PyTorch构建Transformer模型

相较于传统模型,如循环神经网络 (RNN),Transformer 的优势在于能够理解输入和输出序列中元素之间的关系,在大语言模型 (如 ChatGPT 和 DeepSeek) 的发展中起到了关键作用,为了从零开始构建 Transformer,首先探讨自注意力机制,包括查询 (query)、键 (key) 和值 (value) 向量,以及缩放点积注意力 (SDPA)。将层归一化和残差连接集成到多头注意力层中,并与前馈层结合,构建编码器层,堆叠编码器层构建编码器,还将实现 Transformer 中的解码器。

盼小辉丶的博客 3万+

大学生作业:80C51存储器数据传输实验:基本指令和数据传送

大学生作业:80C51存储器数据传输实验,报价 200 文章目录实验一、80C51存储器数据传输实验实验目的:实验内容一:基本指令实验内容二:数据传送 实验一、80C51存储器数据传输实验 实验目的: 熟悉软件的集成开发环境 掌握单片机软件设计流程,掌握存储器结构及各窗口之间的联系 掌握内部数据存储器、外部数据存储器的数据传送特点和应用; 实验内容一:基本指令 用三种方法实现将累加器A内容改为20H ORG 0000H LJMP MAIN ORG 0030H MAIN: ;方法一使用寄

weixin_54707168的博客 5103

大话 KMP 算法

LeetCode上有一题,简单难度的,以下是原题 这个题目应该刷LeetCode的同学大部分都刷到过,比较荒谬的是可以直接用 indexOf 方法实现,并且是最优的解法,看到评论以后一片哗然,大家扯到最多的是这道题就应该用KMP来做,如果用KMP做那这道题应该是困难级别的。所以看了这些评论以后,决定自己去摸索一下KMP的算法,以及大概其实现原理。 网上找了很多关于解释KMP算法的...

lmx125254的博客 3833

7.26华为OD机试真题 新系统 - 炸弹人的雷区数量 (Java/Py/C/C++/Js/Go)

7.26华为OD机试真题 新系统 - 炸弹人的雷区数量 (Java/Py/C/C++/Js/Go)

算法大师! 793

kmp算法和kmp的优化

一、kmp是什么 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。 简单来...

harry12138小白的博客 1498

YOLO26涨点改进 | 全网独家创新,注意力改进篇| SCI一区Top | 引入AFCA自适应细粒度通道注意力,联合建模全局与局部通道依赖关系,适合目标检测、图像去雾、关键点检测、图像分类、图像分割

🔥本文提出了一种基于AFCA(自适应细粒度通道注意力)模块改进的YOLO26目标检测网络。AFCA通过联合建模全局与局部通道依赖关系,实现了更精细的通道注意力分配,能够增强目标相关特征并抑制背景噪声。该模块采用自适应融合策略动态平衡通道权重,在保持轻量级结构的同时,显著提升了小目标和复杂背景下的检测性能。文章详细介绍了AFCA的结构原理、实现优势,并提供了完整的代码实现和YAML配置文件,指导读者如何将该模块集成到YOLO26框架中。实验结果表明,AFCA在检测精度和鲁棒性方面优于传统注意力机制。

Ai缝合怪、助力小伙伴高效发论文 304

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

KMP及KMP改进算法

kmp”看毛片“算法确实很难理解,上网搜了半天想了很久才大概想明白。KMP算法精华在于next数组: "部分匹配值"即next数组就是"前缀"和"后缀"的最长的共有元素的长度。以"ABCDABD"为例, 首先看看 next 数组值的求解方法 。             例如:   模式串 abaabcac      next 值 01122312      ne

memmorryy的专栏 1446

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

算法 kmp算法

kmp算法是改进后的字符匹配算法,它与bf算法的区别是,每次从串与主串匹配失败后,从串与主串匹配的位置不同。下面具体说下这两种算法的区别:主串:BABCDABABCDABCED从串:ABCDABCEDBF算法:第一步:BABCDABABCDABCEDA               从主串的第一个字符位置开始与从串第一个字符位置进行匹配,匹配失败第二步:BABCDABABCDABCED ABCDAB...

夜雨柠檬 833

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【算法】KMP 算法

本文介绍字符串的模式匹配算法之一——KMP 算法,包括其概述、代码实现等。

代码星辰的博客 1446

KMP算法啊啊啊

KMP算法问题引入串引子串的存储顺序存储结构链式存储结构问题来了直观解决方案KMP算法前言next数组KMP算法改进 问题引入 串 引子 我们在生活中可以看到很多的所谓“串”,比如现在我写的这段话就是“串”,更多的,比如我们在网上查找资料,如下图: "KMP"就是一个字符串,而每次我们所搜所完之后界面显示带红色的字就是与之匹配的串,其实就是在一个串中找与之匹配的字串,我感觉搜索的想法很简单:我呈...

xwl666666的博客 3608
上一篇: 快速排序
下一篇: 【学习笔记】【Cocos2d-x Lua脚本开发】如何使用Lua脚本调用自定义类
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值