首页 > 编程语言 >KMP算法

KMP算法

时间:2023-04-06 15:00:09浏览次数:37  
标签:index int printf len next ++ 算法 KMP

一、问题引入

BF算法的平均时间复杂度过高,提出了一种新的匹配算法 KMP算法。

主串S的位置i 一直往下移动,不再回溯。但字串T的位置j 需要根据算法确定下来。

二、解决过程

  • 函数:get_next()
void get_next(const char *T, int **next)
{
	int i = 0, j = -1;
	int T_len = strlen(T);
	(*next) = (int *)malloc(T_len * sizeof(int));
	memset(*next, 0, T_len * sizeof(int));
	(*next)[0] = -1;
	while (i < T_len-1)
	{
		if (j == -1 || T[i] == T[j])
		{
			++i;
			++j;
			(*next)[i] = j;
		}
		else
			j = (*next)[j];
	}
    // test 
	for (int i = 0; i < T_len; i++)
		printf("%d\t", (*next)[i]);
	printf("\n");
}
  • 函数:index_kmp()
int index_kmp(const char *S, const char *T, int pos)
{
	/* pos的有效范围:0<=pos<=S_len-1 */
	int i = pos, j = 0;
	int *next = NULL;
	int S_len = strlen(S);
	int T_len = strlen(T);
	/* 串S和串T不为空串 */
	if (S_len == 0 || T_len == 0)
		return -1;
	if (pos < 0 || pos > S_len)
		return -1;
	get_next(T, &next);
	while (i < S_len && j < T_len)
	{
        printf("第%d轮: i=%d\tj=%d\n", ++count, i, j);  // test
		if (j == -1 || S[i] == T[j])
		{
			++i;
			++j;
		}
		else
		{
			j = next[j];
		}
	}
	free(next);
	if (j >= T_len)
		return i - T_len;
	else
		return -1;
}
  • 函数:main()
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
	char S[] = {"hello world"};
	char T[] = {"ello"};
	int index; // index从0开始
	printf("S_String:%s\n", S);
	printf("T_String:%s\n", T);
	if (-1 == ( index = index_kmp(S, T, 0)))
	{
		printf("Not found\n");
	}
	else
	{
		printf("Found, index is %d\n", index);
	}
	return 0;
}

标签:index,int,printf,len,next,++,算法,KMP
From: https://www.cnblogs.com/caojun97/p/17285999.html

相关文章

  • python实现各种算法详解,以及时间复杂度
    python实现各种排序1.快速排序1:首先取序列第一个元素为基准元素pivot=R[low]。i=low,j=high。2:从后向前扫描,找小于等于pivot的数,如果找到,R[i]与R[j]交换,i++。3:从前往后扫描,找大于pivot的数,如果找到,R[i]与R[j]交换,j--。4:重复2~3,直到i=j,返回该位置mid=i,该位置正好为pivot......
  • 深度学习基础入门篇[三]:优化策略梯度下降算法:SGD、MBGD、Momentum、Adam、AdamW
    1.梯度下降算法(优化器)1.1原理解释如果我们定义了一个机器学习模型,比如一个三层的神经网络,那么就需要使得这个模型能够尽可能拟合所提供的训练数据。但是我们如何评价模型对于数据的拟合是否足够呢?那就需要使用相应的指标来评价它的拟合程度,所使用到的函数就称为损失函数(LossFu......
  • 第十三篇 DOM 补充 - 虚拟DOM 、 diff 算法 及 其他
    bycaixin深圳虚拟DOM(VirtualDOM)什么是虚拟DOM(VirtualDOM)虚拟DOM是⽤JavaScript对象表示的DOM信息和结构;当DOM更新后通过diff算法使之与真实dom保持同步虚拟DOM是一个JavsScript对象,里面包含sel选择器,data数据,text文本内容,children子标签等......
  • #FREERTOS的和heap_4内存分配算法
    FreeRTOS的heap_4内存管理算法具有内存碎片合并的功能,可以有效防止内存碎片产生,使用Firstfit算法,在实现上与C标准库的malloc类似,但是效率更高且能进行碎片合并回收。以下是个人对源码的解析,有空再补充详细。一、初始化staticvoidprvHeapInit(void){BlockLink_t*pxF......
  • 数据结构和算法总览
    1.数据结构  2.算法  3.数据结构脑图  4_1.算法脑图_上部分  4_2.算法脑图_下部分  5.算法--切题四件套 6.算法--五遍刷题法   ......
  • 【算法数据结构专题】「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现
    承接上文承接之前的【精华推荐|【算法数据结构专题】「延时队列算法」史上非常详细分析和介绍如何通过时间轮(TimingWheel)实现延时队列的原理指南】,让我们基本上已经知道了「时间轮算法」原理和核心算法机制,接下来我们需要面向于实战开发以及落地角度进行分析如何实现时间轮的算......
  • 聚类算法
    1.概念聚类->无监督学习(无分类、分组信息)实现->距离、相似性系数目的->数据预处理->复杂数据结构(多维)->标准化发现数据之间的依赖关系,删除或合并有密切依赖关系的数据2.分类1.基于划分的聚类方法自顶向下概念:n个元素组成的数据集D,将数据分成k(k<=n)个簇......
  • 算法之回溯算法
    回溯法含义:类似枚举,一层一层往下递归寻找答案,尝试搜索答案,如果找到了答案,则返回答案,并且寻找其他可能的答案。如果没找到,则像上一层递归寻找可能的答案。回溯算法也是递归算法的一种。为什么要回溯呢?或者说为什么用到回溯算法呢?因为我们不是要找到一个排列就好了,而是需要找......
  • 算法思想
    \(\mathcal{Part}\)1.前提提要注意:本文为提高组难度的算法思想,主要为前缀和,差分等优化因为是思想,讲的会比较玄乎,能理解就好\(\mathcal{Part}\)2.双指针双指针通常解决区间问题步骤是,确定一个右节点或左节点作为一个参考点,通常取右节点,记为\(j\)我们考虑一个刚好符合题......
  • 自动驾驶-预瞄-Pure pursuit纯跟踪算法-MATLAB实现
    有空把引入、逻辑、原理介绍给写了,目前先给大家看看代码。将来写大概会分成这么几块:汽车运动学自行车模型跟踪算法主流模型及特点纯跟踪算法原理推导代码介绍代码原创,来之不易,请勿不注明转载。喜欢点个赞吧!网上许多代码都跑不起来hhclc;clear;%------------formroa......