【KMP算法详解——适合初学KMP算法的朋友】
{
register int TarLen = 0; // Length of Target
register int PatLen = 0; // Length of Pattern
// Compute the length of Pattern
while( '\0' != Pattern[PatLen] )
PatLen++;
while( '\0' != Target[TarLen] )
{
int TmpTarLen = TarLen;
for(int i=0; i<PatLen; i++)
{
if( Target[TmpTarLen++] != Pattern[i] )
break;
if( i == PatLen-1 )
cout<<"Native String Matching,pattern occurs with shift "<<TarLen<<endl;
}
TarLen++;
}
}
我们的观察过程是这样的:
void CptPfFunc( ElemType Pattern[], int PrefixFunc[] )
{
while( '\0' != Pattern[iLen] )
iLen++;
int LOLP = 0; // Lenth of longest prefix
PrefixFunc[1] = 0;
for( int NOCM=2; NOCM<iLen+1; NOCM++ ) // NOCM represent the number of characters matched
{
while( LOLP>0 && (Pattern[LOLP] != Pattern[NOCM-1]) )
LOLP = PrefixFunc[LOLP];
if( Pattern[LOLP] == Pattern[NOCM-1] )
LOLP++;
PrefixFunc[NOCM] = LOLP;
}
}
---------此时满足条件while( LOLP>0 && (Pattern[LOLP] != Pattern[NOCM-1]) )-------------
while语句中的执行
LOLP = 0; NOCM = 12; LOLP = 1; PrefixFunc[12] = 1;
LOLP = PrefixFunc[LOLP];
由以上分析,不难推导KMP算法的实现
{
int PrefixFunc[MAX_SIZE];
register int TarLen = 0;
register int PatLen = 0;
// Compute the length of array Target and Pattern
while( '\0' != Target[TarLen] )
TarLen++;
while( '\0' != Pattern[PatLen] )
PatLen++;
// Compute the prefix function of Pattern
CptPfFunc( Pattern, PrefixFunc );
int NOCM = 0; // Number of characters matched
for( int i=0; i<TarLen; i++ )
{
while( NOCM>0 && Pattern[NOCM] != Target[i] )
NOCM = PrefixFunc[NOCM];
if( Pattern[NOCM] == Target[i] )
NOCM++;
if( NOCM == PatLen )
{
cout<<"KMP String Matching,pattern occurs with shift "<<i - PatLen + 1<<endl;
NOCM = PrefixFunc[NOCM];
}
}
}
by Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest and Clifford .
【KMP算法详解——适合初学KMP算法的朋友】相关推荐
- 编辑距离算法详解:Levenshtein Distance算法——动态规划问题
目录 背景: 求编辑距离算法: 图解过程: C++代码如下: 总结: 背景: 我们在使用词典app时,有没有发现即使输错几个字母,app依然能给我们推荐出想要的单词,非常智能.它是怎么找出我们想要的单 ...
- md5与des算法有何不同_Python算法详解:为什么说算法是程序的灵魂?
算法是程序的灵魂,只有掌握了算法,才能轻松地驾驭程序开发.软件开发工作不是按部就班,而是选择一种最合理的算法去实现项目功能.算法能够引导开发者在面对一个项目功能时用什么思路去实现,有了这个思路后,编程 ...
- 计算机图形学算法详解,计算机图形学裁剪算法详解
<计算机图形学裁剪算法详解>由会员分享,可在线阅读,更多相关<计算机图形学裁剪算法详解(10页珍藏版)>请在人人文库网上搜索. 1.裁剪算法详解在使用计算机处理图形信息时,计算 ...
- python算法详解 张玲玲_Python算法详解
目 录 第 1章 算法概述 1 1.1 算法的基础 2 1.1.1 算法的特征 2 1.1.2 何为算法 2 1.2 计算机中的算法 3 1.2.1 认识计算机中的算法 3 1.2.2 为什么说算法是 ...
- fm算法详解_Python实现FM算法解析
1. 什么是FM? FM即Factor Machine,因子分解机. 2. 为什么需要FM? 1.特征组合是许多机器学习建模过程中遇到的问题,如果对特征直接建模,很有可能会忽略掉特征与特征之间的关联信 ...
- MD5科普(二):MD5算法详解/如何改进MD5算法?
原文链接:https://www.6zou.net/tech/md5_how_to_do.html 一.MD5算法的实现 MD5算法简述: MD5是输入不定長度信息,输出固定長度128-bits的演算 ...
- 编辑距离算法详解:Levenshtein Distance算法
算法基本原理:假设我们可以使用d[ i , j ]个步骤(可以使用一个二维数组保存这个值),表示将串s[ 1-i ] 转换为 串t [ 1-j ]所需要的最少步骤个数,那么,在最基本的情况下,即在i等 ...
- KMP算法详解及代码
KMP算法详解及代码 KMP算法详解及代码 定义及应用 理论 基本概念 next 数组 总结 注意 代码 KMP算法详解及代码 最近正好在看字符串相关的算法内容,就顺便把KMP算法回顾了一下.相应的代 ...
- YOLO v3算法详解
论文地址:YOLOv3: An Incremental Improvement YOLO算法详解,YOLO v2算法详解 1.The Deal 接下来,从头梳理整个网络,如果对YOLO和YOLO v2 ...
最新文章
- 创建web服务器||HTTP协议的概念||报文||HTTP请求与响应处理——未完待续
- php 模仿 java_js模仿java的Map集合,实现功能
- Mysql5.X重点难点速记
- wxWidgets:滚动Scrolling
- could not create the java virtual machine启动eclipse报错
- Java面向对象--小游戏2
- Asp.Net Core 混合全球化与本地化支持
- [转帖]H.264 RTP payload 格式(有效载荷)
- php require persion denied,php,nginx_php+nginx配置权限问题(13: Permission denied),php,nginx - phpStudy...
- epplus保存为流_C# 使用EPPlus 秒导出10万条数据
- matlab练习程序(非负矩阵分解)
- 2.剑指Offer --- 面试需要的基础知识
- 转:Apple的App Analytics统计平台你必须知道的
- win10电脑找不到xps查看器的详细解决步骤
- learun通用权限系统框架功能实现设计
- 请问如何制作中国象棋对弈软件的界面部分?
- Promise.all()、Promise.allSettled()、Promise.any()、Promise.race()用法与区别
- 阿里P9:做了6年架构设计,这次聊聊微服务与分布式事务细节
- 晶振作为电子产品“心脏”关键部分,究竟是什么原理起到什么作用
- python主要是干什么用的,python到底是干什么的
热门文章
- 小学计算机国培研修总结,小学教师信息技术国培心得体会
- vue echarts 山东地图 toptip滑过提示显示文字 合并莱芜的
- 将excel数据批量插入到数据库表中
- 网站模板html psd,20个新鲜出炉的网站模板【HTML PSD】
- leetcode刷题记录总结-7.二叉树
- lua文件读取注意事项
- Python英文单词排序
- 【黑苹果EFI下载】三星笔记本270e5k( Intel酷睿i5 5200U)+Maco10.14.2完美EFI文件
- java中的identity_java – 有没有办法使用Hibernate的IDENTITY ID生...
- python爬虫实战 爬取汽车之家上车型价格