当前位置: 首页 > news >正文

网站 设计案例东莞房价走势

网站 设计案例,东莞房价走势,新手如何做网站运营,高端大气网站源码前言: 在一些寻找子串的问题中,我们常常使用的是BF算法,也就是暴力算法,这样做的时间复杂度通常都是O(N^2),且不能体现出算法的美妙之处(虐人之处),于是三位大佬D.E.Knuth&#xff0…

前言:

        在一些寻找子串的问题中,我们常常使用的是BF算法,也就是暴力算法,这样做的时间复杂度通常都是O(N^2),且不能体现出算法的美妙之处(虐人之处),于是三位大佬D.E.Knuth,J.H.MorrisV.R.Pratt提出了一种船新的方法,时间复杂度真的很低 O(n+m),这个算法由三位大牛的名字首字母来命名,也就是我们今天的主角KMP算法。

        我将KMP算法的详解分为三个篇章:

      ->【原理篇】:主要讲解KMP实现的原理,以及手动求NEXT数组。

         【数理篇】:主要讲解如何在手动求出NEXT数组的情况下,找出数学规律,为之后的算法实现奠定基础。

         【实现篇】:主要讲解以C语言代码的方式实现KMP算法,以及NEXT数组的优化。

        其余篇章将在之后更新

🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈

  制作不易,若对你有帮助的话点赞、关注、评论走一波,你们的支持是我前进路上最大的动力。

实现原理: 

        当你有两个字符串DES(目标字符串)和PAT(模板字符串),你要去DES中寻找是否有子字符串与模板串PAT相同。

        BF也就是暴力算法的实现思路是这样的:当DES[i]==PAT[j]的时候,先记录此时的I下标,令cnt=I,之后执行I++,J++。若DES[i]!=PAT[j]的时候I回退到起始下标,也就是cnt的位置,j回退到PAT字符串的首位也就A(0)的位置;

聪明的你一定发现,这样做会导致i和j一直往回走,效率实在不高,有没有可能让j有规律的回退,而i一直向前呢?

KMP算法就是这样做的!

试想一下,当i与j分别指向这的时候,表示前三个字符都匹配上了,接下来我们按照BF算法的思路,让i,j向后移动一格。

这时候DES[i]所指向的字符为A,而PAT[j]所指向的字符为C,按照BF的思路,此时i j都需要执行一个回退的操作。但你们仔细观察看看,j能指向C是否能说明,前三个元素AAA是DES中前四个元素的一个子串?

也就是说PAT的AAA一定在DES中能被匹配上,不然J也无法移动到这了。

那我们这时候还需要将J回退到最开始的位置吗?我们不需要了!我们只需要将j移动到PAT数组中,以PAT[0]为首,PAT[j-1]为结尾的两个子字符串的长度位就可以了。听不懂没关系,底下我会介绍这种算法

(例如AAA,以第一个A为首,中间的A为尾是第一个子字符串,以中间的A为首,最后一个A为尾是第二个子字符串,这两个子字符串的长度为2,2为长度位,这时将J移动到PAT中下标为2的地方)。

但你不禁会想:为什么要这么退呢?因为你退回的是DES中匹配过的所有的字符的子字符串。这是一个难点,可以自己多举几个例子想想。若没听懂也可以先接着往下看,影响不大。

这也就是KMP算法当中的核心之处:NEXT数组。

 NEXT数组:

 在前面,我们已经简单体会到了NEXT数组,可以用这么一句话来概括NEXT数组的作用

指导PAT中的j要回退到PAT中的哪一个位置。NEXT[j]存储了从PAT[0]到PAT[j-1]位置,以PAT[0]为首,PAT[j-1]为结尾的两个最长子字符串的长度位(可以重叠,但不能相等)。

 那么我们怎么来求NEXT数组呢?别急,接下来我会举两个例子。

EX1:

012345678910
PAT字符串abcababcabc
NEXT数组-10001212345

我们规定,NEXT[0]=-1 NEXT[1]=0.(有些地方的定义不一样,但这没关系,在代码中做相应修改就可以了)从NEXT[2]开始,我们需要自己算。

牢记我们的口诀,NEXT[j]=以PAT[0]为首,PAT[j-1]为结尾的两个最长子字符串的长度位(可以重叠,但不能相等)。

我们看看NEXT[2]中是否满足呢,首:a 尾:b显然没有以a为首b为尾的字符串,那么我们就在这里填上0,也就是NEXT[2]=0

NEXT[3]:首:a  尾:c,显然也没有以a为首,c为尾的两个子字符串,所以NEXT[3]=0;

NEXT[4]:首:a  尾:a,pat[0]=a,pat[3]=a,找到了两个子字符串(就是首尾本身),他们有多长呢?显然是长度1,所以NEXT[4]=1

NEXT[5]:首:a  尾:b,pat[0-1]=ab,pat[3-4]=ab(这里表示下标3到下标4,下同),找到了两个子字符串,以PAT[0]为首,PAT[4(5-1)]为尾的两个字符串,长度为2,所以NEXT[5]=2

NEXT[6]:首:a  尾:a,pat[0]=a,pat[5]=a,找到了两个字符串(就是首尾本身),他们有多长呢?显然是长度1,所以NEXT[6]=1

NEXT[7]:首:a  尾:b,pat[0-1]=ab,pat[5-6]=ab,找到了两个子字符串,以PAT[0]为首,PAT[6(7-1)]为尾的两个字符串,长度为2,所以NEXT[7]=2

NEXT[8]:首:a  尾:c,pat[0-2]=abc,pat[5-7]=abc,找到了两个子字符串,以PAT[0]为首,PAT[7(8-1)]为尾的两个字符串,长度为3,所以NEXT[8]=3

NEXT[9]:首:a  尾:a,pat[0-3]=abca,pat[5-8]=abca,找到了两个子字符串,以PAT[0]为首,PAT[8(9-1)]为尾的两个字符串,长度为4,所以NEXT[9]=4

NEXT[10]:首:a  尾:b,pat[0-4]=abcab,pat[5-9]=abcab,找到了两个子字符串,以PAT[0]为首,PAT[9(10-1)]为尾的两个字符串,长度为5,所以NEXT[10]=5

到此,该PAT的next数组已经告一段落。下面还有一个例子,我直接给出了答案,若还是没懂,可以对照上面的方法进行求解或评论私信问我都可。

012345678910
PAT数组abcababcabc
NEXT数组-10001212345

至此,本篇博客的内容九分钟带你弄懂KMP算法【原理篇】告一段落,若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。

若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。

诸君,山顶见!

🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈

http://www.yayakq.cn/news/726928/

相关文章:

  • 钓鱼网站是什么技术的人做的出来网站制作风格类型
  • 华阳路街道网站建设中国制造网官方网站国际站
  • 文化馆为何需要建设自己的网站大学科技园网站建设
  • 建材网站设计免备案网站空间
  • 公司向要做一个网站要怎么做企业建立网站步骤
  • 青浦网站设计制作网站建设方式
  • 移动互联和网站开发网站建设策划书前言
  • wordpress子站点打不开最大的建筑招工平台 app
  • 网站添加定位怎么做最近新闻热点国家大事
  • 扬州将建设网站北京海淀区邮编
  • 装修公司做自己网站简述网站建设的基本思路
  • 公司简介结尾怎么写徐州做网站优化
  • 100个游戏代码深圳市网络seo推广平台
  • 设计素材网站导航大全大连网站开发企业
  • 花店网站模板免费注册163免费邮箱申请
  • 吉安哪里做网站短视频动漫怎么做出来的
  • 网站运营策划书网站指向wordpress
  • 增加网站备案长沙优质营销网站建设设计
  • 移动端网站设计尺寸安全网站建设网站制作
  • 百度云用流量做网站做内贸要在哪个网站找客户
  • 清徐县建设局网站青岛抖音seo
  • 南康区城乡规划建设局网站自己有网站想制作个程序
  • asp做的药店网站模板oa系统网页版
  • 2018年怎样做淘宝客网站南宁网络优化seo费用
  • 嘉兴网站排名优化北京空间优化平台
  • 品牌网站建设企业除了昵图网还有什么做图网站
  • 手机网站静态动态网站建设服务器怎么设置
  • 济南教育平台网站建设深圳网站推广哪家好
  • 杭州 电商设计网站建设网站建设 竞标公司要求
  • 五合一小程序网站软件界面制作