C语言数据结构(10)--串的改进模式匹配算法(KMP)

简介: 本文目录1. KMP概述2. 代码实现

1. KMP概述

改进的匹配算法,又称为KMP算法。当匹配过程中发现主串和模式串字符不等,主串的字符位置指针不再回退,而是利用之前匹配的信息将模式串的匹配位置尽可能的移动,再继续比较的算法。


KMP算法还是相当复杂的,说实话我看了好几个小时才稍微理解了,此处附上一篇我感觉讲的比较到位的博客:详解KMP算法。


2. 代码实现

虽然算法比较复杂,但是实现起来代码量很小,佩服!

/*
* 主题:KMP模式匹配算法
* 作者:熊猫大大
* 时间:2020-09-22
*/
#include <stdio.h>
// 获取子串的next数组
void getNext(char *pattern,int next[]) 
{
  //初始化变量
  int i, j, len;
  len = strlen(pattern);
  i = 0;
  j = -1;
  next[0] = -1;//固定值
  // 循环设置next数组每个位置的值
  while (i < len) 
  {
    if (j == -1 || pattern[i] == pattern[j]) 
    {
      i++;
      j++;
      next[i] = j;
    }
    else 
    {
      j = next[j];
    }
  }
}
// kmp模式匹配 -1表示匹配失败,其他值表示匹配位置
int kmpIndex(char *main,char* pattern,int next[]) 
{
  // 初始化变量
  int i, j, mainLen, patternLen;
  i = 0;
  j = -1;
  mainLen = strlen(main);
  patternLen = strlen(pattern);
  // 查找匹配串的位置
  while (i < mainLen&&j < patternLen) 
  {
    // 通过next快速调整j的位置
    if (j == -1 || main[i] == pattern[j]) 
    {
      i++;
      j++;
    }
    else
    {
      j = next[j];
    }
  }
  if (j >= patternLen) //匹配成功
  {
    return i - patternLen;
  }
  else //失败
  {
    return -1;
  }
}
int main()
{
  char * pattern = "bcd";
  int* next= (int*)malloc(sizeof(int)*strlen(pattern));
  getNext(pattern,next);
  char * main = "abcd";
  printf("位置:%d", kmpIndex(main, pattern, next));
}
相关文章
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
794 1
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
315 0
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
541 10
 算法系列之数据结构-二叉树
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
504 3
 算法系列之数据结构-Huffman树
|
算法 Java
算法系列之数据结构-二叉搜索树
二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。
680 22
|
机器学习/深度学习 监控 算法
局域网行为监控软件 C# 多线程数据包捕获算法:基于 KMP 模式匹配的内容分析优化方案探索
本文探讨了一种结合KMP算法的多线程数据包捕获与分析方案,用于局域网行为监控。通过C#实现,该系统可高效检测敏感内容、管理URL访问、分析协议及审计日志。实验表明,相较于传统算法,KMP在处理大规模网络流量时效率显著提升。未来可在算法优化、多模式匹配及机器学习等领域进一步研究。
339 0
|
机器学习/深度学习 算法 C语言
详细介绍递归算法在 C 语言中的应用,包括递归的基本概念、特点、实现方法以及实际应用案例
【6月更文挑战第15天】递归算法在C语言中是强大力量的体现,通过函数调用自身解决复杂问题。递归涉及基本概念如自调用、终止条件及栈空间管理。在C中实现递归需定义递归函数,分解问题并设定停止条件。阶乘和斐波那契数列是经典应用示例,展示了递归的优雅与效率。然而,递归可能导致栈溢出,需注意优化。学习递归深化了对“分而治之”策略的理解。**
590 7
|
搜索推荐 C语言 C++
【排序算法】C语言实现归并排序,包括递归和迭代两个版本
【排序算法】C语言实现归并排序,包括递归和迭代两个版本
760 1
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
979 23
|
11月前
|
存储 C语言
`scanf`是C语言中用于按格式读取标准输入的函数
`scanf`是C语言中用于按格式读取标准输入的函数,通过格式字符串解析输入并存入指定变量。需注意输入格式严格匹配,并建议检查返回值以确保读取成功,提升程序健壮性。
1586 0

热门文章

最新文章