c语言kmp算法代码,C语言KMP算法的实现
KMP算法在模式与主串之间存在许多“部分匹配”的情况下,比BF算法快。(注意,接下来的串都是以下标为1作为起始储存位置。)
下面说一下实现代码:
首先是预定义和类型定义:
#define MAXLEN 100
typedef struct{
char ch[MAXLEN + 1];
int length;
}SString;
KMP算法主体函数:
int Index_KMP(SString S, SString T, int pos)
{
int i, j;
int next[MAXLEN + 1];
i = pos;
j = 1;
get_next(T, next);
while (i < T.length)
{
if (j == 0|| S.ch[i] == T.ch[j])
{
++i;
++j;
}
else
j =next[j];
}
if (j >= T.length)
return i -T.length + 1;
else
return 0;
}
先对模式串T的next[]进行取值,具体实现函数get_next()下面给出。将pos的值赋值给i,表示从元素的第pos个值开始对比;让j等于1,表示模式串T从第一个元素开始对比。当j等于0的时候,表示之前没有任何元素相同,且此时i和j都在下一轮该对比的元素的前一位,所以让i和j均加1。当i小于S.length并且j小于T.length的时候,将S.ch[i]和T.ch[j]进行对比,若相等,则对比下一位元素,若不相等,则让j回到模式串T开头和模式串T的j之前匹配的位置。最后当跳出循环的时候,若j的值大于或等于T.length的话,则说明匹配成功,返回该位置;否则表示匹配失败,返回0.
接下来是对结构串的next[]进行取值的函数get_next():
void get_next(SString T, int next[])
{
int i, j;
next[1] = 0;
i = 0;
j = 1;
while (j
{
if (i == 0|| T.ch[i] == T.ch[j])
{
++i;
++j;
next[j]= i;
}
else
i =next[i];
}
}
在看这段代码之前,先理解next[i]的值。个人理解,next[i]记录着开头与当前位置前一位元素匹配的元素的位置。让next[1]=0,在对比过程中,当存在不相等的情况的时候,若此时i=1,则i会等于0,此时模式串T的i,j都在对比元素的前一位,则让i,j都加1,并且让T中下标j的位置指向位置标记为1,回到第一位元素。
加入main()进行测试(注意:写程序的时候建议将KMP主体函数和get_next()函数位置与上面所写的位置对调):
int callen(SString S)
{
int i;
for (i = 0; S.ch[i] !='\n'; i++);
return i;
}
int main(void)
{
SString S, T;
int pos = 1, n, i;
for (i = 1; S.ch[i -1] != '\n'; i++)
{
S.ch[i] =getchar();
}
S.length = callen(S);
fflush(stdin);
for (i = 1; T.ch[i -1] != '\n'; i++)
{
T.ch[i] =getchar();
}
T.length = callen(T);
n = Index_KMP(S, T,pos);
printf("%d\n",n);
return 0;
}
c语言kmp算法代码,C语言KMP算法的实现相关推荐
- c语言快速排序算法代码,c语言快速排序算法示例代码分享
#include #include #include #define RANDOM(i) (rand()%i) #define N 9 //设置数组长度 //分区操作 int Partition ...
- C语言雪花算法,记一次雪花算法的实现
作者最近在实现雪花算法生成主键,看了不少文章.个人觉得雪花算法的最大的优点是有序(减少数据库的页分裂页合并).雪花算法本身很简单,但他依赖于时间,也就是机器或容器的时间一回拨就出现问题了.网上也出现了 ...
- javaKMP算法(含KMP算法代码)
目录 一:应用场景-字符串匹配问题 二:暴力匹配算法 三:KMP 算法介绍 四:KMP 算法最佳应用-字符串匹配问题 字符串匹配问题: 思路分析图解 五:代码展示 一:应用场景-字符串匹配问题 字符串 ...
- 06 聚类算法 - 代码案例二 - K-Means算法和Mini Batch K-Means算法比较
03 聚类算法 - K-means聚类 04 聚类算法 - 代码案例一 - K-means聚类 05 聚类算法 - 二分K-Means.K-Means++.K-Means||.Canopy.Mini ...
- 字符串匹配KMP算法设计C语言,KMP字符串匹配算法笔记
网上有很多解释KMP算法的文章,A_B_C_ABC的这篇很详细,反复看了好几遍,总算理解了个大概,但是总觉得没那么爽快.其实,一种算法各人有各人的理解方法,找到适合自己理解的才容易记住.下面是我对这个 ...
- 字符串匹配——KMP算法【C语言】
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的核心是利用匹配失败后 ...
- kmp算法的c语言,KMP算法 纯C实现
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我自己写的KMP算法: int nt[256]; void get_next1(char* T, int next[], int tlen) { int ...
- 字体识别c语言,OCR算法之C语言代码 - 源码下载|图形图象|图形/文字识别|源代码 - 源码中国...
OCR算法代码. 这不是一个完整的系统,没法生成可执行程序. 代码基于Linux/KDE开发,用到了C++标准模板库. 代码的目的是向读者展示一个OCR系统包括哪些部分,如何工作, 读者可以借鉴这些代 ...
- 【C++】KMP算法代码实现
KMP模式匹配算法的实现: 利用KMP模式匹配算法在主串中查找指定模式串.如果主串包含该模式串,则返回该模式串在主串中的序号:否则返回-1. 输入样例: abcddabcababcdaabcababc ...
最新文章
- 刷脸取件遭小学生破解,丰巢智能柜紧急下线相关功能
- Oracle 10g数据库基础之基本查询语句-中-函数
- Oracle 返回结果集 sys_refcursor
- Oracle数据库文件恢复与备份思路
- 微信公众号每次调用接口正确或错误的返回码
- mysql emoji 显示不出来_解决 Mysql 存取 emoji 表情的问题
- python3.5以及scrapy,selenium,等 安装
- 杭电2078复习时间
- angularjs 学习笔记(一) -----JSONP跨站访问
- Jquery 中 $('obj').attr('checked',true)失效的几种解决方案
- 人人对战五子棋 C++
- vsscanf用法解析
- Codeforces - Captain Flint and Treasure
- Togaf业务架构-《企业级业务架构设计方法论与实践》解读
- 岛屿周长c语言,[IOI2008]Island 岛屿
- 正确的选择大于努力_选择正确技术的11个注意事项
- 家装网线该如何选择?怎么区别好坏
- Cacti使用安装详解
- 单独按戴尔笔记本f11键和f12键无法调节亮度了怎么办?用(Fn+F11键或者Fn+F12键就好)
- 3.1-图像分割引言
热门文章
- Python手记-11:PyQuery爬取豆瓣电影评论
- 程序设计c语言杨艳丽,2015.04.15数学组:杨艳丽老师公开课:《4.1用字母表示数》...
- android滑动自动吸顶效果,安卓当下最流行的吸顶效果的实现(上)
- Windows调整桌面鼠标右键文件顺序
- tombstones分析方法--转载自CrazyDiode的cnblog
- python怎么快速打括号_三分钟,让你弄清楚Python中函数的括号使用
- 优化WinXP启动 加速开机时间(转)
- 英雄联盟下载官方下载最新版 v3.1.4.4 正式版​
- HAWQ技术解析(三) —— 基本架构
- 机器学习(十六)——多元正态分布(The multivariate normal distribution)