码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • KMP算法(详解加图解)


    前言

    最近学校对数据结构的串部分KMP算法进行了讲解,出于好奇,感觉这个代码简洁干练,但思想有很我发现KMP算法确实很巧妙,所以在此想做一个总结,分享给大家.子字符串查找问题,历史上有很多种方法,都是在此问题上,提高整体的效率,提炼出一个简洁,时间复杂度较低的算法.这篇博客介绍的KMP算法求解子字符串问题就是由Knuth,Morris,Pratt三位大佬创建出来的.

    问题描述

    子字符串查找,给定一个长度位N的文本字符串和一个长度为M的模式字符串,在文本中找到和该模式字符串相符的子字符串.求文本文件满足要求的字符串的首元素下标.
    文本:a b c a b c a b c f,模式串:c a b c a,你可能一看就知道答案时2,但是当文本字符串足够长,长度达到一万,甚至十万,此时如果还是采用"肉眼观察法",就很难观察的出来,往往黑客盗取密码就是在几万行代码中输入Password关键词找到相应的位置,来达到目的.
    说到这里,可能有人会觉得可以采用暴力的方法求解(Brute Force),如下图:
    在这里插入图片描述暴力求解通过遍历文本串和模式串,通过指针i和指针j的回溯,来达到找子字符串的目的.其思路主要就是通过遍历文本串中的每一个元素,以此元素为起点,与模式串进行比较,如果相等,就是同时向后移动,但是如果最终出现不匹配的情况,文本串就需要回溯到起始位置的下一个元素继续遍历. 对时间复杂度分析就会发现,最差的情况时间复杂度为O(NM),显然不是最佳的方案.
    我们发现暴力算法,每一次与模式串比较,最终文本串都需要回溯一遍,那有没有一种方法可以让文本串中的指针i不进行回溯呢,KMP算法就是如此.

    KMP算法思想

    以上面的问题为例子,使用KMP算法求解.与暴力求解算法不同的地方是,KMP算法中的指针i不需要

  • 相关阅读:
    云容灾最佳实践!美创DBRA助力包头医学院第二附属医院核心系统容灾建设
    Flink1.15源码阅读——PER_JOB vs APPLICATION执行流程
    web前端网页设计与制作——华夏第一县HTML+CSS+JavaScript
    拒绝水文!八大排序(三)【适合初学者】快速排序
    208. 实现 Trie (前缀树)
    Python中实现数值交换的四种方式
    五城联动!尧泰汉海“四季有爱·益路向阳”公益活动圆满落幕
    锁机制总结
    【学习日志】2022.11.18 Technical Artist Training Tutorial----Unlit Shader Of Unity
    CSS3技巧37:JS+CSS3 制作旋转图片墙
  • 原文地址:https://blog.csdn.net/m0_64332179/article/details/127709070
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号