字符串匹配 - 模式预处理:朴素算法(Naive)(暴力破解)

news2024/9/20 18:40:52
朴素的字符串匹配算法又称为 暴力匹配算法(Brute Force Algorithm),最为简单的字符串匹配算法。

算法简介

朴素的字符串匹配算法又称为暴力匹配算法(Brute Force Algorithm),它的主要特点是:
  • 没有预处理阶段;

  • 滑动窗口总是后移 1 位;

  • 对模式中的字符的比较顺序不限定,可以从前到后,也可以从后到前;

  • 匹配阶段需要 O((n - m + 1)m) 的时间复杂度;

  • 需要 2n 次的字符比较;

很显然,朴素的字符串匹配算法 NAIVE-STRING-MATCHER 是最原始的算法,它通过使用循环来检查是否在范围 n-m+1 中存在满足条件 P[1..m] = T [s + 1..s + m] 的有效位移 s。

伪代码如下:

NAIVE-STRING-MATCHER(T, P)
  n ← length[T]
  m ← length[P]for s ← 0 to n - m
    doif P[1.. m]= T[s + 1.. s + m]then print "Pattern occurs with shift" s

如上图中,对于模式 P = aab 和文本 T = acaabc,将模式 P 沿着 T 从左到右滑动,逐个比较字符以判断模式 P 在文本 T 中是否存在。

可以看出,NAIVE-STRING-MATCHER 没有对模式 P 进行预处理,所以预处理的时间为 0。而匹配的时间在最坏情况下为 Θ((n-m+1)m),如果 m = [n/2],则为 Θ(n2)。

图例分析

假设有两个字符串:

  • M="abcdefabcdx";

  • T="abcdx";

想要找到T串在M串中的位置,要怎么找呢?

也就是说,从主串M的第一个字符开始分别与子串从开头进行比较,当发现不匹配时,主串回到这一轮开始的下一个字符,子串从头开始比较。直到子串所有的字符都匹配,返回所在主串中的下标。

算法复杂度

假设S的长度是m,T的长度是n,暂不考虑pos,从字符串S的开头开始比较。

  • 最好的情况是第一次就匹配了,需要比较的次数是n.

  • 最坏的情况下,就是上面举的这种例子,需要把整个字符串都比较完,从下面的代码中就体现为把两层循环都跑了一遍。这时候,比较的次数就是t*(s-t+1).

所以这个算法的(最坏)时间复杂度就是o(t(s-t+1)),近似为o(n2).

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/352277.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

功率放大器科普知识(晶体管功率放大器的注意事项)

虽然功率放大器是电子实验室的常用仪器,但是很多人对于它却没有清晰的认识,下面就让安泰电子来为大家介绍功率放大器的科普内容以及使用注意事项,希望大家可以对功率放大器有清晰的认识。功率放大器可以把输入信号的功率放大,以满…

NFT Insider #86:A16z 领投,YGG 获得 1380 万美元融资,The Sandbox与《北斗神拳》合作

引言:NFT Insider由NFT收藏组织WHALE Members、BeepCrypto联合出品,浓缩每周NFT新闻,为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据,艺术新闻类,游戏新闻类,虚拟世界类&#…

智能小车红外循迹原理

循迹电路循迹电路由收发一体的红外收发管P1,P2;电位器R18,R29;发光二极管D6,D7和芯片LM324等组成。一共有两路,对应的红外电位器用于调节灵敏度。LM234用于信号的比较,并产生比较结果输出给单片…

MySQL8.0 optimizer_switch变化

Optimizer_switch变量是支持对优化器行为的控制。是一组值标志,每个标志都有一个on或off的值,以指示是否启用或禁用相应的行为。 MySQL8.0里除了熟悉的hash join重大变化之外,其他方面也有优化。 mysql> SHOW VARIABLES LIKE OPTIMIZER_…

14 基数排序(桶排序)

文章目录1 基数排序基本思想2 基数排序的代码实现2.1 java2.2 scala3 基数排序总结1 基数排序基本思想 1) 基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort&#…

【Python】循环语句(while,for)、运算符、字符串格式化

一、while循环Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。其基本形式为:while 判断条件(condition):执行语句(statements)执行语句可以是单个语句或语句…

Git、小乌龟、Gitee的概述与安装应用超详细(组长与组员多人开发版本)

目录 一、概述 1.什么是Git? 2.Git历史来源 3.Git的优点? 4.什么是版本控制? 5.版本控制工具种类? 6.Git工作机制 7.Git、小乌龟、Gitee、凭据管理器的简单介绍 二、Git下载安装 下载Git 安装Git 安装完成后查看版本 三、下载小…

防水蓝牙耳机评测,值得入手的四款蓝牙耳机分享

提到蓝牙耳机,大家第一反应是音质跟佩戴舒适度要好,其实除了这两个功能,还有就是防水性能不能少,而且防水等级越高,耳机寿命也就越长,那么,我们该如何 选购一款好用的蓝牙耳机呢?下面…

Echarts 配置横轴竖轴指示线,更换颜色、线型和大小

第018个点击查看专栏目录本示例是描述如何在Echarts上配置横轴竖轴指示线,更换颜色、线型和大小。方法很简单,参考示例源代码。 文章目录示例效果示例源代码(共85行)相关资料参考专栏介绍示例效果 示例源代码(共85行&a…

数据的TCP分段和IP分片

本文简述下TCP分段和IP分片的区别与联系。 我们知道,用户空间的数据拷贝到内核空间的TCP发送缓冲区(这个是一个结构体,叫sk_buffer,简称skb)后就由内核网络协议栈做后续的封装和发送处理了,用户无需考虑下…

【Node.js】开发自己的包!

造包开发自己的包!初始化包的基本结构页面使用根据需要也可以将模块化拆分编写包的说明文档发布包把包发布在npm上删除已发布的包模块的加载机制内置模块的加载机制自定义模块的加载机制第三方模块的加载机制当目录作为模块时的加载机制开发自己的包! 初…

3|射频识别技术|第二讲:RFID系统的组成与工作原理|批注·上

https://blog.csdn.net/m0_57656758/article/details/128153964?spm1001.2014.3001.5501我国用无线射频识别技术实现药品管理的市场还是空白其运用具有较大的市场空间。药品运输及存储环境监控药品有效期监控提升用药安全策略血液制剂监控特殊、违禁药品监控商品价格监控药品生…

【Flutter】入门Dart语言:简单易懂的变量指南

文章目录一、概述二、详解1. 变量的声明2. 常量变量3.late 延迟初始化变量4. 变量的命名规则三、总结一、概述 “不抱有希望的人生是毫无意义的。” —— 阿卜杜勒阿齐兹 Dart中的变量是存储值的容器。它们可以是数字、字符串、布尔值或其他数据类型。变量在定义时必须指定类型…

网络原理 (1)

网络原理 文章目录1. 前言: 2. 应用层2.1 XML2.2 json2.3 protobuffer3. 传输层3.1 UDP3.1 TCP4. TCP 内部的工作机制 (重点)1. 确认应答 2.超时重传3. 连接管理3.1 建立联系 :三次握手3.2 断开连接 : 四次挥手4. 滑动窗口5. 流量…

长按power键,点击重启按钮,系统重启流程一

1.有可能会涉及到如下文件 2.文件流程

Spring基础总结(上)

Spring基础总结(上) 1. Spring 如何创建一个 Bean 对象 通过调用对象的无参构造方法创建一个新对象,然后通过依赖注入得到bean对象(默认单例)依赖注入这一步对新对象中添加了 Autowired 或者Resource 等注解的属性赋值,得到 Bean 对象,如下…

openOffice pdf.js spring boot 微信在线预览office pdf文件

下载openoffice 并安装//pdf.js 案例 https://mozilla.github.io/pdf.js/examples/index.html#interactive-examples//openoffice 连接不上 进入安装目录 cmd 运行以下命令 soffice -headless -accept"socket,host127.0.0.1,port8100;urp;" -nofirststartwizard<!…

技术管理之产品管理

一、产品相关概念 1.1 产品的定义 作为商品提供给市场&#xff0c;被人们使用和消费&#xff0c;并能满足人们某种需求的任何东西&#xff0c;包括有形的物品和无形的服务、组织、观念或者它们的组合&#xff1b;简单点产品就是解决某一类问题的东西。 1.2 产品思维 产品思…

安全研发人员能力模型窥探

能力 是一个比较抽象的概念&#xff0c;不同的行业、管理者、研发人员对能力的认知都会有差异。另外&#xff0c;作为研发团队的相应的职级定级、绩效考核的基础&#xff0c;一个“大家普遍认可”的能力的模型是非常重要的。这是比职级模型更高层的一个基本模型&#xff0c;所谓…

漏洞之S2-048 远程代码执行漏洞(CVE-2017-9791)

一、漏洞详情二、环境搭建1、使用vulhub搭建&#xff0c;搭建方法详见&#xff1a;https://blog.csdn.net/qq_32393893/article/details/129027549?spm1001.2014.3001.55012、切换到vulhub/struts2/s2-0483、启动容器 docker-compose up -d4、访问虚拟机IP:8080端口&#xff0…