KMP时间复杂度分析

2023-11-17

比较过程分析

这里写图片描述

比较次数

比较次数: 红色 + 蓝色
蓝色部分是相比暴力求解,节省下的比较次数

周期

从比较次数可以看出,呈现 1 1 1 1 5 这样的周期

  • 一个周期内的比较次数:8
  • 周期长度:5
  • 周期个数:n/5
  • 比较总次数: 周期个数 * 一个周期内额比较次数 = 1.8n

一般化结论:
- 一个周期内的比较次数:1 * (M - 1) + M
- 周期长度:M
- 周期个数:N/M
- 比较总次数: 周期个数 * 一个周期内额比较次数 = (2 - 1/M)*N < 2N

因此是线性

接下来证明,上述情况是KMP算法的最差情况

最差情况

  1. 模式串
    当模式串长度为M,首字符和其他字符全都相等(假定都为a),模式串存在最长的k前缀和k后缀, next数组呈现递增样式:-1,0,1,2…
  2. 需要匹配的字符串
    • 串成周期性分布,周期为M
    • 前M-1都为a,第M位不等于a

模式串

模式串的最坏情况比较好理解,因为每次当s[i] 不等于 P[j]时,j = next[j],一直按照next数组值进行回溯,当模式串全相等时,next数组呈现递增,每次回溯一个位子,因此比较次数是最多的

待匹配字符串


  1. 为什么呈现周期性的字符串满足
    假设存在一个字符串,使得模式串匹配完,比较次数最多,那么以这个子串为基础形成的周期性字符串一定也是匹配次数最多的
  2. 一个比较次数最多的子串,如何构造
    假设不在M处失配,而是在k处就失配了,那么匹配次数为(k - 1)*1 + k,由上面的公式可以得到,当k = m时,比较次数是最多

比较总次数:15 < 18
这里写图片描述

最好情况

  1. 模式串
    当模式串的首字符和其他字符都不相等时,模式串不存在相等的k前缀和k后缀,next数组全为-1
  2. 需要匹配的字符串
    无要求
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

KMP时间复杂度分析 的相关文章

  • Linux-0.12内核sleep_on函数分析

    sleep on用于进程休眠 原型如下 void sleep on struct task struct p 当进程访问某个互斥资源时 如果资源被另外进程占用 当前进程就需要休眠 假设资源的结构如下 struct res struct ta
  • HD DVD技术概要

    中文译者 陆其明 徐成哲原文标题 HD DVD A technical introduction原文版权 DVD论坛 http www dvdforum org 原文链接 http www dvdforum org images Forum

随机推荐

  • 伸手党福利文,Python入门大全

    文章目录 一 自学时间安排 Day1 Day15 Python语言基础 Day16 Day20 Python语言进阶 Day31 Day35 Linux操作系统 Day35 Day40 数据库基础和进阶 Day41 Day55 实战Djan
  • 编写函数对字符串进行反向排列

    1 题目 编写一个函数 reverse string char string 递归实现 实现 将参数字符串中的字符反向排列 不是逆序打印 要求 不能使用C函数库中的字符串操作函数 比如 char arr abcdef 逆序之后数组的内容变成
  • Sqlite数据库增删改查

    1 应用部分 package com example language import androidx appcompat app AppCompatActivity import android content ContentValues
  • 超级全的停用词整理

    一切看似逝去的 都不曾离开 你所给与的爱与温暖 让我执着地守护着这里 尤而小屋 一个温馨的小屋 小屋主人 一手代码谋求生存 一手掌勺享受生活 欢迎你的光临 人民 末 末 啊 阿 哎 哎呀 哎哟 唉 俺 俺们 按 按照 吧 吧哒 把 罢了 被
  • Vim编辑器使用

    一 Vim 编辑器简介 vi 编辑器是 Linux 里最基本的文本编辑器 系统自动安装了 vi 而 vim 是 vi 的加强版 vi 不显示高亮颜色语法 vim 能显示高亮颜色语法 如果系统没有自动安装 vim 需自行下载安装 二 Vim
  • Python实现登录接口测试

    一 准备数据 1 获得测试路径 即URL 2 准备测试数据 获取方式 二 可以先使用postman测试 调通后再使用Python实现 三 编写Python
  • MATLAB绘图函数fplot详解

    MATLAB绘图函数fplot详解 一 fplot基本语法 fplot不同于plot 主要用来根据函数表达式和自变量所属区间来直接绘制函数曲线 不需要给出像plot需要给出的自变量和因变量的数组 因此当函数表达式已知的情况 使用fplot绘
  • 倚天服务器里怎么修改装备,倚天私服完整GM命令

    倚天私服完整GM命令 本文出处 网游动力作者 本站发布时间 2009 07 26阅读次数 save命令 save XXX 手动保存玩家数据 save all 手动保存当前地图所有玩家数据 a命令 a ymir 999 调整ymir等级为99
  • 观察者模式和发布订阅模式

    观察者模式与发布订阅模式的区别 1 观察者模式中只有观察者和被观察者 发布订阅模式中有发布者 订阅者 调度中心 2 观察者模式是被观察者发生变化时自己通知观察者 发布订阅模式是通过调度中心来进行分布订阅操作 vue2中响应式数据就是由Obj
  • 【大数据技术】Spark MLlib机器学习特征抽取 TF-IDF统计词频实战(附源码和数据集)

    需要源码和数据集请点赞关注收藏后评论区留言私信 特征抽取 TF IDF TF IDF是两个统计量的乘积 即词频 Term Frequency TF 和逆向文档频率 Inverse Document Frequency IDF 它们各自有不同
  • QT笔记- 对QSring字符串内容进行过滤筛选或对QLineEdi的可输入内容进行控制,使其不含某些字符、只含某些字符或只含特定格式的字符串,如只含字母数字和下划线

    QSring字符串内容的过滤筛选 QString类函数contains 用于判断字符串中是否含有某些字符 其有两个重载函数 第一个是简单筛选 第二个是使用 正则表达式 之后有解释 进行筛选 两函数原型为 bool QString conta
  • protocol buffer 编解码

    平时的开发中使用pb格式协议较多 大致了解了一下pb的编解码 即序列化和反序列化 本文参考官方文档 https developers google com protocol buffers docs encoding hl zh cn 先看
  • Word去除多余的页眉

    word去除多余的页眉 1 在正式页眉开始的页面点击鼠标 此时光标位于要删除页眉下划线页的首部 2 单击上方菜单栏的 页面布局 分隔符 分节符 下一页 3 在正式页眉开始的地方双击鼠标 进入 页眉编辑 状态 4 单击 页眉和页脚 将 链接到
  • SVN时代...

    SourceForge开始全面支持Subversion 这真是个好消息 这预示着CVS独霸天下的时代快要结束 SVN时代就要来临 和CVS比起来 SVN的确很强大 这就像它的出现就是为了取代CVS一样 它的目标快要实现了 具体的功能特性大家
  • Cocos2d-x 3.17.1 Android Studio环境搭建和创建编译项目和真机调试

    eclipse NDK参考 https www cnblogs com l d d p 6531557 html 最近项目上需要用Cocos2d x在Android智能硬件上进行开发 很早之前搭建过Cocos2d x3 15 1 Eclip
  • 利用IDM实现百度云满速下载

    一 IDM Internet Download Manager 简称 IDM 是一种将下载速度提高5倍的工具 可以恢复和安排下载 由于连接丢失 网络问题 计算机关机或意外停电等原因 全面的错误恢复和恢复功能将重新启动中断或中断的下载 简单的
  • MATLAB绘制正弦函数与余弦函数的线性组合曲线

    h0 figure toolbar none position 200 150 450 350 name 实例11 x 0 pi 20 2 pi y1 sin x y2 cos x h1 stem x y1 y2 画出线性组合的图 hold
  • SQL注入——学生选课系统注入

    目录 前言 一 实验环境 二 实验步骤 1 万能密码 2 堆叠注入 3 报错注入 4 时间盲注 前言 本次实验利用教师指定的学生选课管理系统进行SQL注入 包含万能密码登录 堆叠注入 报错注入和时间盲注 一 实验环境 Windows10虚拟
  • QT 15--获取任何种类文件的某些文件属性:大小、创建时间、上次修改时间等等

    1 首先说一些 如果是mainwindow的QT工程 如果打算做自己手写ui 界面的话 该如何将自己写的内容添加到mainwindow界面呢 方法为 新建一个widget类 然后将所有零件都用布局布置好后 只需将总布局添加到widet 然后
  • KMP时间复杂度分析

    比较过程分析 比较次数 比较次数 红色 蓝色 蓝色部分是相比暴力求解 节省下的比较次数 周期 从比较次数可以看出 呈现 1 1 1 1 5 这样的周期 一个周期内的比较次数 8 周期长度 5 周期个数 n 5 比较总次数 周期个数 一个周期