hihocoder 第三周
提示二:NEXT数组的使用
“那么,为了能够充分理解NEXT数组,我们再来回顾一下如何使用NEXT数组~"小Hi摆出一副老师的样子,说道。”首先我们来给出NEXT数组的数学定义~“
NEXT[0] = -1NEXT[i] = max{ 0<=k< i | str.substring(1, k) == str.substring(i - k +1 , i) } 其中str.substring(i, j)表示str从位置i到位置j的子串,如果i>j则,substring为空
”那么我们对之前例子中的模式串进行求解,可以得到这样的NEXT数组。“小Hi在纸上写了又写,画了又画。
模式串: |
b a b a b b |
NEXT: |
0 0 1 2 3 1 |
”然后再来看这个NEXT数组是如何使用的!为了表明NEXT的所有使用情况,我们换一个原串。然后首先,我们第一次匹配,如果 用ori表示原串,用par表示模式串,用p表示原串的下标(从1开始),用q表示模式串的下标(从1开始)的话,会发现最多匹配到p=5, q=5就不能往下匹配了,因为此时ori[p +1]不等于par[q + 1]“小Hi为了使说明更加简洁,先下了一堆定义。
”好的!小Hi老师好棒!“小Ho在一旁煽风点火道。
原串(p=5): |
babab | abcbababababb |
模式串(q=5): |
babab | b |
”此时,令q = NEXT[q],并将ori[1..p]和par[1..q]对齐,便会发现ori[1..p]和par[1..q]仍然是一一对应的。“
原串(p=5): |
babab | abcbababababb |
模式串(q=3): |
bab | abb |
“此时,ori[p+1]和par[q+1]相同了,于是可以继续往下匹配,但是到了p=7,q=5的时候又发现不能够接着匹配了。”
原串(p=7): |
bababab | cbababababb |
模式串(q=5): |
babab | b |
”此时,令q = NEXT[q],并将ori[1..p]和par[1..q]对齐,便会发现ori[1..p]和par[1..q]仍然是一一对应的,这和之前是一样的。”
原串(p=7): |
bababab | cbababababb |
模式串(q=3): |
bab | abb |
“此时,ori[p+1]和par[q+1]仍然不相同,于是还得令q=NEXT[q]。”
原串(p=7): |
bababab | cbababababb |
模式串(q=1): |
b | ababb |
“此时,ori[p+1]和par[q+1]仍然不相同,令q=NEXT[q]。”
原串(p=7): |
bababab | cbababababb |
模式串(q=0): |
| bababb |
“此时,ori[p+1]和par[q+1]仍然不相同,令q=NEXT[q]。”
原串(p=7): |
bababab | cbababababb |
模式串(q=-1): |
| bababb |
”到了这一步,就相当于我们之前所说的模式串与原串的对齐点(即枚举的原串中的起点位置)越过了这条线(当时指C右侧的那条线)的情况,这种情况下,就应当p和q均+1,然后继续之前的操作。”小Hi擦了一把汗,说道。
“这样一说,我就大致能够理解NEXT数组是怎么用来求解模式匹配问题的了,但是它是如何求的呢?一般的方法不是要O(模式串长度的立方)的么?”小Ho问道。
“这就是我接下来要和你说的啦!”小Hi笑道:“但是让我先喝口水!”
提示三:如何求解NEXT数组
“首先我们不想如何求整个NEXT数组,而是假设我们已经知道了之前例子中模式串的NEXT[1..4],来求NEXT[5]如何?”小Hi建议道。
“好的!这样我们就只需要平方级的算法就可以算出它的值了!”小Ho高兴道。
“有点追求好不好!”小Hi深深的吸了一口气:“你这样和之前的解法有什么不同么!”
“似乎没有。。那你说怎么算吧!我反正脑子已经成浆糊了。”小Ho郁闷道。
“我们把par.substring(1, 5)当做新的原串ori_new,然后把par.substring(1, 4)当做新的模式串par,会如何?”小Hi微微一笑。
“会。。我来试试!"小Ho接过小Hi手中的纸笔,便开始演算:“首先就直接匹配到了p=4, q=4的情况,这时候严格来说已经算匹配完成了,但是肯定不是就这么结束的,此时par_new[q +1]因为是空字符,所以肯定和ori_new[p+1]匹配不上。于是令q = NEXT[q]”
原串(p=4): |
baba | b |
模式串(q=4): |
baba | |
原串(p=4): |
baba | b |
模式串(q=2): |
ba | b |
”然后这时候ori_new[p + 1]就直接和par_new[q + 1]匹配上了,于是新的p=5,q=3,莫非……这个最后的q就是NEXT[5]!“小Ho忽然灵光一闪。
”没错,就是这样!那你想想现在如何求NEXT[6]。“小Hi继续引导小Ho。
”首先我们没有必要重新从头开始匹配,直接在原串和模式串的后面加上第6个字符就可以了。“小Ho分析道。
原串(p=5): |
babab | b |
模式串(q=3): |
bab | abb |
”没法继续匹配,于是令q=NEXT[q]。“
原串(p=5): |
babab | b |
模式串(q=1): |
b | ababb |
”还是没法继续匹配,于是令q=NEXT[q]。“
原串(p=5): |
babab | b |
模式串(q=0): |
| bababb |
”此时可以匹配了,新的p=6,q=1,所以NEXT[6]就是1!“小Ho高兴道:”没想到NEXT数组的本身会用一种递归的方式进行求解,真是太巧妙了!“
”那你要不要赶紧去写一下代码,KMP算法的代码可是可以写的很短很巧妙的哦!~“小Hi建议道。
”好!“
/** next[]的含义: x[i-next[i]...i-1]=x[0...next[i]-1]* next[i]为满足x[i-z...i-1]=x[0...z-1]的最大z值(就是x的自身匹配)*/
void kmp_pre(char x[],int m,int next[])
{int i,j;j = next[0] = -1;i = 0;while(i < m){while(-1 != j && x[i] != x[j]) j = next[j];next[++i] = ++j;}
}
int next[10010];
int KMP_Count(char x[],int m,char y[],int n)
{//x是模式串, y是主串int i, j;int ans = 0;kmp_pre(x, m, next);i = j = 0;while(i < n){while(-1 != j && y[i] != x[j]) j = next[j];i++; j++;if(j >= m){ans++;j = next[j];}}return ans;
}
hihocoder 第三周相关推荐
- 提高班第三周周记(中秋第一天)
这是第三周,也是中秋节.没有月饼的中秋节.但我过得很充实.我很快乐,发自内心的. 中秋第一天早上贾琳师哥讲课.讲他为什么辞职来这里.他的确学成,有着令人羡慕的工资.可是他的问题让我触动. 提到了邓稼先 ...
- python嵩天课堂笔记_[Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周)
[Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) [Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) 目录 强化学习 定义 马尔科夫决策过程 基本元素 值函数 最优值 ...
- 在首次发布三周之后,MLflow迎来了0.2版本
在今年的Spark+AI峰会上,MLflow团队推出了MLflow,一个开源的用于简化机器学习生命周期的平台.从首次发布到现在的三周时间里,已经有很多数据科学家和工程师对使用MLflow和为MLflo ...
- 清华贵系的期末大作业:奋战三周,造台计算机!
大数据文摘授权转载自AI科技评论 作者 | 蒋宝尚 编辑丨陈彩娴 本科大三,正在学习计算机组成原理,能做个什么项目? 清华大学贵系说:造台计算机吧! 清华有门本科三年级必修课,名为<计算机组成原 ...
- 三周写出高性能的Python代码,这些小技巧你值得一试。
1一个不上进的 Python 使用者 我是一个有 C 语言背景的开发者.最近转做了 Python,平时用 Python 还算 6,这周在给新员工分享工作之后,有个小孩跑来问我:"哥,你是学 ...
- 5月第三周全球域名解析商Top15:万网DNSPod份额上涨
IDC评述网(idcps.com)05月27日报道:据域名统计机构WebHosting.info数据得知,在5月第三周(5月13日-5月19日)期间,全球域名市场基本保持稳定.与上周相比,美国域名解析 ...
- 2019-2020-3 《Java 程序设计》第三周知识总结
2019-2020-3 <Java 程序设计>第三周知识总结 1.类的定义 语法格式如下(加[]表示可选项): [修饰符] class 类名 { 属性定义(声明) 方法定义(声明)} 2. ...
- 学号 20172326 《程序设计与数据结构》第三周学习总结
学号 20172326 <程序设计与数据结构>第三周学习总结 教材学习内容总结 队列是先进先出的数据结构(FIFO)与栈不同,队列的两端可分别进行操作 first与front相同,返回首段 ...
- .INFO域名总量跌破700万,8月第三周净减51,477个
中国IDC评述网08月23日报道:近日,据WebHosting.info公布的数据显示,截至2012年8月20日,全球.INFO域名注册总量已跌破700万个,为6,976,763个,8月第二周持续负增 ...
最新文章
- SAP Promotion Managementfor Retail (SAP PMR)
- c语言移数有n个整数使其,有N个整数,使其前面各数顺序向后移动M个位置,最后M个数变成前面的...
- php的cgi的设置,apache中配置php支持模块模式、cgi模式和fastcgi模式
- C# 的 Console类
- call/apply以及this指向的理解
- 计算机控制面板图标显示,Win8桌面如何有计算机/控制面板图标
- 探讨 | 深入探讨Redis管道
- 三菱fx3u通讯手册_使用USR-N510实现局域网内连接FX3U
- 明天发布一个基于Silverlight的类Visio小型绘图工具项目。
- 自带CA ,sha256 哈希签名,2048 位加密 脚本,通用
- www.icourse163.org中国大学MOOC网页端无法打开或显示不全的解决方法
- 四川师范大学大学计算机基础,大学计算机基础课程教学改革探索——以四川师范大学为例...
- 微信小程序点击事件传递参数
- SIFT特征匹配算法介绍——寻找图像特征点的原理
- 企信下载的文件在哪里_Foobar2000(无损音乐播放器下载)(软件篇)
- win7安装Android Studio
- ArcGIS中shp文件的裁剪
- 智能人物画像综合分析系统——Day7
- SLE12 Server 在线安装MySQL Server
- Android 这些技术 —— 你都了解过吗