BF算法 KMP算法

2023-10-27

BF算法
又叫朴素算法,时间复杂度为O(mn),相比KMP算法比较简单,举个例子,对于给定的主字符串“ababbcabcdabcde”和子串“abcd”;我们用i和j来分别遍历两个字符串,比较两个i,j 对应字符串位置的元素是否相等,如果相等则i++,j++去比较下一个元素,如果i和j 对应位置的元素不相等,则j需要退回到子字符串的0号下标位置,而i需要退回到之前的位置+1,这个位置下标也就是i-j+1的位置,然后继续比较,相等i++,j++,不等j需要退回到子字符串的0号下标位置,i需要退回到i-j+1的位置,重复只到找到为止,找到返回i-j,找不到返回-1:

在这里插入图片描述KMP算法
KMP算法的时间复杂度为O(m+n),所以它相比于BF算法O(mn)更为高效,原因在于KMP算法相比于BP算法去掉了很多重复遍历的情况,它的实现过程与BF算法不一样的地方在于,KMP算法的主串i并不会回退,并且j也不会回退到0号位置:

例如:
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述但你会发现中间那些步骤都是多余的,由于子串的首位’a’与后面的2、3、4、5位上的字符都是一样的,你直接就可以到最后一步,也就是你直接可以拿next[1]的值去代替后面与它相同的字符的next[j]的值,于是未来避免这种问题我们队next数组进行了改良,得到nextval数组:nextval数组值的推导(它是建立在next[]数组的基础上的):

j 0 1 2 3 4 5 6 7 8
子串 a b a b a a a b a
next[j] -1 0 0 1 2 3 1 1 2
nextval[j] -1 0 -1 0 -1 3 1 0 -1
1、当j等于0是,nextval[0] = -1;
2、当j = 1时,因为1号下标的字符‘b’的next值为0,而0号下标的字符为‘a’与‘b’不相等,所nextval[1] = next[1] = 0,维持原值;
3、当j = 2时,因为2号下标的字符‘a’的next值为0,而0号下标的字符为‘a’与‘a’相等,所nextval[2] = nextval[0] = -1;
4、当j = 3时,因为3号下标的字符‘b’的next值为1,而1号下标的字符为‘b’与‘b’相等,所nextval3] = nextval[1] = 0;
……

所以:
推导nextval数组时,首先判断当前字符与当前字符的next数组值对应的位置的字符相等不,如果不相等,nextval[j] = next[j],不需要变,如若相等,那么nextval[j] = nextval[next[j]];

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BF算法 KMP算法 的相关文章

  • 吹捧不是区块链的全部,冷静才是正道!

    尽管区块链能给我们带来完全不同的想象空间 但是依然掩盖不了它是一个新生的底层技术的现实 如果在一个技术的新生阶段就去吹捧它如何之好 显然是不对的 因为对于新生技术来讲 它的最初阶段最应该具备的 姿势 就是不断丰富和完善自己 为自己未来与诸多
  • 稳定和不稳定排序算法之间的区别?

    最近在一次采访中 在对排序算法提出了一些最初的问题 例如 您如何编写QuickSort或QuickSort和MergeSort之间的区别 之后 访问者问您是否了解稳定和不稳定的排序算法之间的区别 这个问题对我的读者来说是新问题 所以他说 对
  • 马云谈王坚博士!

    马云谈王坚博士 阿里的了不起在于把一个心理学博士变成出色的CTO 文 马云 阿里巴巴董事局主席 第一次见到王坚博士时 我震撼于他对互联网技术未来发展的理解 有一种相见恨晚的感觉 第一次在集团战略会议上听到博士谈未来数据时代 惊叹于他对数据技
  • 数学建模(五)1、皮尔逊相关系数

    皮尔逊相关系数 一 相关基本数学概念 总体和样本 二 皮尔逊相关系数 1 总体均值与总体协方差 2 总体皮尔逊相关系数 3 样本皮尔逊相关系数 4 相关性可视化 5 皮尔逊相关系数的一些理解误区 在统计学中 皮尔逊积矩相关系数用于度量两个变
  • 前缀和与差分(初学推荐)

    前缀和 适用于静态数组区间和 时间复杂度 O n 原理 当两个整数a b对k具体相同余数 a k b k 那么a b一定为k的倍数 a b 一维前缀和 题目一 k倍区间 给定一个长度为N的数列 A1 A2 AN 如果其中一段连续的子序列Ai
  • BI数据分析方法小结

    author skate time 2011 04 06 对于电子商务网站 我们该如何对数据分析呢 当我们拿到数据的时候该做些什么 要回答这几个问题前 先回答如下问题 1 数据是给谁看的 2 看数据的人 想从数据中得到什么 或者用数据证明什
  • java创建类关键字_在Java中,可以使用关键字【】来创建类的实例对象

    摘要 特别叫量呼的海是对 使用关集中用于部过的局负荷控制 向某行试呼的个目特定制用制在某一来限段内的进次数时间g控 学院现重如发患全隐大安 创例对或发故全事生学生安 息 造作被坚决因信杜绝动成工 迅速向分管院告要在第一长报时间 使用关撞击角
  • Spring 如何使用JDK动态代理呢?

    转自 Spring 如何使用JDK动态代理呢 下文是笔者采用示例的方式讲述JDK动态代理的实现方法 如下所示 实现思路 Spring JDK 动态代理需要实现 InvocationHandler 接口 重写 invoke 方法 客户端使用
  • Spring 配置数据库用户名密码加密

    Spring 配置数据库用户名密码加密 传统形式配置数据库用户名密码 对于一般的spring框架 经常要用到数据源配置 如果是用xml配置的话 一般都是如下形式 数据库用户名密码密文配置实现 现在的需求是不能在配置文件里明文配置数据库用户名
  • 30 张快速学习 Java 的思维导图

    前两天一直给大家分享的是我的学习历程还有面试流程 希望能够帮助和鼓励到大家 今天我继续给大家分享我的一下学习的小方法 大家有兴趣的可以多看看 觉得还不错的就给我点点赞 今天给大家分享的是 Java 知识点总结的思维导图 整理成了这篇文章 帮
  • shell脚本练习1 ————10秒钟倒计时脚本

    root 1 cat time sh bin bash for i in 10 1 do clear echo n i echo n 不换行输出 sleep 1 done root 1 cat time sh bin bash for i
  • python print 打印不使用省略号

    import tensorflow as tf import os import numpy as np np set printoptions threshold np inf threshold 指定超过多少使用省略号 np inf代表
  • SQL语句基础介绍

    SQL语句基础介绍 SQL语句主要可以分为以下3个类别 DDL Data Definition Language 语句 数据定义语言 这些语句定义了不同的数据段 数据库 表 列 索引等数据库对象 常用的语句关键字主要包括create dro
  • js 获取url 携带的参数

    window location 对象所包含的属性 hash 从井号 开始的 URL 锚 host 主机名和当前 URL 的端口号 hostname 当前 URL 的主机名 pathname 当前 URL 的路径部分 href 完整的 URL
  • 【Flutter 1-12】Flutter手把手教程Dart语言——什么是泛型和泛型的使用场景

    作者 弗拉德 来源 弗拉德 公众号 fulade me 泛型 如果你查看数组的API文档 你会发现数组List的实际类型为List
  • java:面向对象(Object类-equals()).

    Obeject 是所有对象的直接后者间接父类 传说中的上帝 该类中定义的肯定是所有对象都具备的功能 我们写这样一个代码 class Demo class ObjectDemo public static void main String a
  • nginx隐藏版本号及nginx

    查看nginx安装了哪些插件 nginx V 停止并卸载老的nginx systemctl stop nginx ps ef grep nginx 备份老的配置 find name nginx mv etc logrotate d ngin
  • Unity Dotween插件的运动曲线(Ease)介绍Ease选项Ease效果示例以及C#修改动画曲线功能

    前言 我们在制作动画时经常使用这个Dotween插件 在移动 旋转 透明度等等参数的控制都可以使用该插件 而且在这个插件上的控制动画可以设置曲线 内置的曲线有这些 内置曲线 以InOutSine的曲线进行往右移动 效果是这样的 能看出开始是
  • 解析Exception和C#处理Exception的常用方法总结

    在 NET中 异常是指成员没有完成它的名称宣称可以完成的行动 在异常的机制中 异常和某件事情的发生频率无关 异常处理四要素包括 一个表示异常详细信息的类类型 一个向调用者引发异常类实例的成员 调用者的一段调用异常成员的代码块 调用者的一段处
  • 综合评价方法

    文章目录 1 综合评价概述 1 1 基本概念 1 2 综合评价问题的五个要素 1 3 综合评价方法的思路 1 4 常用综合评价方法 2 确定权重类 2 1 信息浓缩 因子分析和主成分分析 2 2 数字相对大小 层次分析法 2 3 信息量 熵

随机推荐

  • Linux下查看软件安装路径

    Linux下查看软件安装路径 1 查询软件安装路径 在Linux操作系统中查看软件安装路径是通过whereis 命令 如查看sshd软件的安装路径时输入命令 whereis sshd sshd usr sbin sshd usr share
  • [创业之路-61] :创业者(老板)与职场(经理人)的区别(身份、职责、专业技能、行为模式)

    在职场中 创业者和职场人的行为有重大的区别 职场人从打工到创业 行为方式也需要发生重大的转变 这里以职业经理人泛指所有的职场人 本文就是探讨这个差别和自己的心路感悟 一 身份不同 创业者老板 自己独自成立或者和别人一起成立一家公司 其通过公
  • GAME Kit开发记录

    2D Game Kit开发记录 作为一款经典的2D游戏 seeker的构成用到了很多U3D中常用的手法和操作 其中包括角色移动 攻击 不同地形的材质处理 机关的触发 敌人系统 以及UI设置等 1 建立场景 作为整个游戏的基础 场景是玩家进入
  • ES6 Module 模块

    文章目录 ES6 module模块 概述 使用 export default 和 import 方式一 导出变量 方式二 导出方法 方式三 导出对象 export 和 import 方式一 方式二 别名 导出别名 导入别名 整体别名 exp
  • [黑科技] WPS通过VB宏函数实现自编号功能

    这篇文章主要是作为李老师 算法设计与分析 助教课程中 与她交流 学到的一些基础知识 它主要是讲述Word通过宏函数设置一些操作 比如在Word全文中替换一些符号 再如对Word上角表进行编号 如果删除中间某个值 运行宏函数自动编号 对Wor
  • 小程序-页面生成为图片,点击保存和分享

    前言 在实际项目中 我们可能会遇到类似的场景 点击后生成一张banner 该banner是图片类型 格式不限 用户在该页面单击之后会生成一个有遮罩的预览 长按之后有保存和分享等操作 一 海报制作 这里我们需要使用canvas来制作banne
  • 已经有int了,为什么要用integer?

    int是JAVA八大基本数据类型 byte shor int long char boolean float double 之一 JAVA语言为八大基本数据提供了包装类 Integer对应是int类型的包装类 就是把int类型包装成Obje
  • ffmpeg基础四:RTP协议

    参考 零声学院 协议学习方法 1 协议是什么 双方约定好如何传输消息 比如视频传输协议 要告诉你这个包是h264包 还是aac音频包 这个信息一般放在协议头 对方收到网络包 可以直接在协议头部获取出这些信息 所以协议的组成一般都是 协议头
  • [Python] 过程型程序设计进阶(三):Python函数装饰器

    概念 修饰器也是一个函数 接受一个函数或方法作为其唯一的参数 并返回一个修饰后的函数或方法 作用 对函数或方法进行一次修饰和包裹 之前学习过 property修饰器 接下来学习如何自定义一个修饰器 自定义函数修饰器 自定义一个装饰器 一般是
  • Jmeter集合点技术(同步定时器)

    一 集合点简介 我们怎么实现真正的并发 并发 指的是系统中正在操作业务的用户 在Jmeter中 成为线程数 Jmeter中的各线程 用户 在进行业务操作中的顺序存储存在一定的随机性 集合点的目的 让各个线程 用户 步调一致 对系统进行加压
  • MySQL8.0连接问题总结

    MySQL8 0连接问题总结 1 驱动包版本 2 驱动类 3 连接属性 1 驱动包版本 对于8 0版本的MySQL数据库 驱动包版本也要跟上 一般使用mysql connector java 8 0 11 否则会报如下错误 Caused b
  • vue代码片段

    Place your snippets for vue here Each snippet is defined under a snippet name and has a prefix body and description The
  • new Object() 和Object.create(null)

    new Object 和Object create null const obj1 a 10 b 20 const obj2 a 10 b 20 obj1 obj2 gt gt gt false 引用类型 因为内存地址不同 const ob
  • Spring之ApplicationContext快速入门

    目录 一 概述 二 代码演示 三 BeanFactory与ApplicationContext的关系 四 BeanFactory的继承体系 五 ApplicationContext的继承体系 一 概述 ApplicationContext称
  • mfc 程序闪退_VC6 在Window10 上操作打开文件时闪退或直接退出的解决方法

    1 下载FileTool exe 并解压 2 打开VC6 0 点击File Open Workspace 选择刚解压出来的FileTool dsw 并确定 3 点击Bulid Build FileTool dll 生成FileTool dl
  • 编程求1平方+2平方+...+n平方

    题目描述 编程求1平方 2平方 n平方 输入 输入一行 只有一个整数n 1 lt n lt 200 输出 输出只有一行 这意味着末尾有一个回车符号 包括1个整数 样例 输入 5 输出 55 提示 循环语句 include
  • 浅谈Visitor访问者模式

    一 前言 什么叫访问 如果大家学过数据结构 对于这点就很清晰了 遍历就是访问的一般形式 单独读取一个元素进行相应的处理也叫作访问 读取到想要查看的内容 对其进行处理就叫作访问 那么我们平常是怎么访问的呢 基本上就是直接拿着需要访问的地址来读
  • [USACO Open08]农场周围的道路

    题目描述 约翰的 N 1 N 10 9 只奶牛要出发去探索牧场四周的土地 她们将沿着一条路走 一直走到三岔路口 可以认为所有的路口都是这样的 这时候 这一群奶牛可能会分成两群 分别沿着接下来的两条路继续走 如果她们再次走到三岔路口 那么仍有
  • linux ./ 执行run文件,如何在Ubuntu中执行.bin和.run文件

    在解释如何在Ubuntu上执行 bin和 run文件之前 让我们首先定义这些文件扩展名到底是什么 Bin档 Ubuntu中的Binary或BIN文件指的是安装软件包 其中大多数是self extracting可执行文件 用于在系统上安装软件
  • BF算法 KMP算法

    BF算法 又叫朴素算法 时间复杂度为O mn 相比KMP算法比较简单 举个例子 对于给定的主字符串 ababbcabcdabcde 和子串 abcd 我们用i和j来分别遍历两个字符串 比较两个i j 对应字符串位置的元素是否相等 如果相等则