热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

KMP算法最详细分析!!

1.首先明确,next数组存在的意义是什么:示例如下:主串:ababcabcacbab模式串:abcac匹配过程如下
1.首先明确,next数组存在的意义是什么:

示例如下:

主串:  a b a b c a b c a c b a b

模式串: a b c a c

匹配过程如下:

第一次匹配:

这个时候,如果不用KMP,而是用BF,那么我们的做法很明显:

尝试模式串的第一个字符和主串的第二个字符进行匹配。

很明显,这是多余的,这是肯定不成立的,而next数组直接告诉我们,跳过这一步,直接如下

这就是next的作用,如果还不明显,你再看上图,模式串的第五位是c和主串相对位置的b不匹配,那么按照BF算法,我们需要

再用主串的第四位和模式串的第一位比较,但是,很舒服,next数组告诉我们不用这样,直接如下

以上就是next的作用,跳过无用的匹配。

2.思考,next为什么可以这样做呢?

首先,什么是next数组:

上述模式串的next数组如下:

a b c a c

0 1 1 1 2

简而言之,每个字母x对应的next数组值是这样的出来的:x前的子串和主串的前几个字母相同,则只需要比较x和主串的第y个元素就好了,那么这个y就是next[x的索引]的值。

下面引入求next数组的算法:

next存储起始从1开始

void GetNext(string s,int next[])//s是模式串

{

    int i=1,j=0;next[1]=0;

    while(i

        if(j==0||s[i]==s[j]){

            i++;j++;

            next[i]=j;

        }

        else{

            j=next[j];//这一步很关键,他起到的作用就是刚才上面讲到的配对失败之后,直接跳到指定的位置

        }

    }

}

既然已经得到next数组了,那么实际操作就很简单了,附上KMP代码:

int KMP(string s,string t,int pos)//参数分别是主串,模式串,求模式串在主串第pos个字符之后的位置

{

    int i=pos,j=1;

    while(i

        if(j==0||s.data[i]==t.data[j]){

            i++;j++;//均后移一位

        }

        else j=next[j];//找到适当的位置

    }

    if(j>t.length())return i-t.length();//匹配成功

    else return -1;

}


推荐阅读
  • 来自FallDream的博客,未经允许,请勿转载,谢谢。一天一套noi简直了.昨天勉强做完了noi2011今天教练又丢出来一套noi ... [详细]
  • 本文详细介绍了在PHP中如何获取和处理HTTP头部信息,包括通过cURL获取请求头信息、使用header函数发送响应头以及获取客户端HTTP头部的方法。同时,还探讨了PHP中$_SERVER变量的使用,以获取客户端和服务器的相关信息。 ... [详细]
  • java datarow_DataSet  DataTable DataRow 深入浅出
    本篇文章适合有一定的基础的人去查看,最好学习过一定net编程基础在来查看此文章。1.概念DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据 ... [详细]
  • 题面:P3178[HAOI2015]树上操作好像其他人都嫌这道题太容易了懒得讲,好吧那我讲。题解:第一个操作和第二个操作本质上是一样的&# ... [详细]
  • 利用Cookie实现用户登录状态的持久化
    本文探讨了如何使用Cookie技术在Web应用中实现用户登录状态的持久化,包括Cookie的基本概念、优势及主要操作方法,并通过一个简单的Java Web项目示例展示了具体实现过程。 ... [详细]
  • 本文介绍了如何通过创建自定义 XML 文件来修改 Android 中 Spinner 的项样式,包括颜色和大小的调整。 ... [详细]
  • 本文将详细介绍如何配置并整合MVP架构、Retrofit网络请求库、Dagger2依赖注入框架以及RxAndroid响应式编程库,构建高效、模块化的Android应用。 ... [详细]
  • 本文档旨在提供C语言的基础知识概述,涵盖常量、变量、数据类型、控制结构及函数定义等内容。特别强调了常量的不同类型及其在程序中的应用,以及如何正确声明和使用函数。 ... [详细]
  • Kubernetes Services详解
    本文深入探讨了Kubernetes中的服务(Services)概念,解释了如何通过Services实现Pods之间的稳定通信,以及如何管理没有选择器的服务。 ... [详细]
  • 本文探讨了Android系统中联系人数据库的设计,特别是AbstractContactsProvider类的作用与实现。文章提供了对源代码的详细分析,并解释了该类如何支持跨数据库操作及事务处理。源代码可从官方Android网站下载。 ... [详细]
  • 垂直泊车路径设计
    本文探讨了垂直泊车路径的设计原理与实现方法。垂直泊车是指汽车从特定位置出发,经过一系列横向和纵向移动,最终达到与车位垂直停放的状态。路径设计旨在确保泊车过程既高效又安全。 ... [详细]
  • 本文详细介绍了在MyBatis框架中如何通过#和$两种方式来传递SQL查询参数。使用#方式可以提高执行效率,而使用$则有助于在复杂SQL语句中更好地查看日志。此外,文章还探讨了不同场景下的参数传递方法,包括实体对象、基本数据类型以及混合参数的使用。 ... [详细]
  • This article explores the process of integrating Promises into Ext Ajax calls for a more functional programming approach, along with detailed steps on testing these asynchronous operations. ... [详细]
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
  • 探索CNN的可视化技术
    神经网络的可视化在理论学习与实践应用中扮演着至关重要的角色。本文深入探讨了三种有效的CNN(卷积神经网络)可视化方法,旨在帮助读者更好地理解和优化模型。 ... [详细]
author-avatar
JY哥在世
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有