简单高效的字符串匹配算法

news2024/11/19 18:26:59

Quick Search算法

算法简介

Quick Search算法属于Sunday算法的一种。Sunday算法由Daniel M Sunday在1990年提出。论文原文:A VERV FAST SU6STRINC SEARCH ALGORITHM

在论文中,作者提出了三个不同的算法:Quick Search算法、Maximal Shift算法以及Optimal Mismatch算法。作者证明了这三种算法效率均优于Boyer-Moore算法。其中,Optimal Mismatch略微好于前两者。但在原理及应用上,Quick Search最为简单。

Quick Search可以被视为一种简化的Boyer-Moore算法。该算法仅使用Boyer-Moore中的“坏字符”规则。此外,与Boyer-Moore算法不同,Quick Search在匹配字符串时是按从头到尾的顺序匹配的。

在下面的描述中,字符串s为目标串(主串、被匹配串),长度为n;字符串p被称为模式串(子串、匹配串),长度为m。

算法步骤

首先将字符串s与p头部对齐,开始以下步骤:

  1. 从p的头部至尾部开始逐一与s匹配

  2. 若匹配成功返回对应位置。若匹配失败,则聚焦到s与p匹配范围外的第一个字符c(图中绿色框)。

  3. 向右移动p,令p中最后一个c与s中的c对齐,如果p中不存在c,则将整个p向后移动m+1位。回到步骤1,重复步骤1、2、3。

请添加图片描述

以上匹配操作的时间复杂度为 O ( n ) O(n) O(n)。为了对任意一个字符c,我们都能快速定位到其在p中最后出现的位置,在执行以上匹配之前需要进行预处理:

基于字符串p构造一个数组a,数组长度等于字符串中所有可能出现的字符数(一般为256),字符对应的数组元素为该字符在p中最后出现的位置与字符串末端的距离+1,举个例子,字符串p为“abc”,则a[‘a’] = 3, a[‘b’] = 2, a[‘c’] = 1。其他未出现的字符对应的数组元素则统一赋值为p的长度+1。预处理操作的时间复杂度为 O ( m ) O(m) O(m)

在匹配过程中,对于s中的任意一个字符c,通过a[c]即可得到p向后移动的位数。

代码

#define ALLCHAR 256

int QuickSearch(char* s, char *p) {
    int n = strlen(s), m = strlen(p);
    int a[ALLCHAR];
    for (int i=0; i<ALLCHAR; ++i)   //初始化数组a
        a[i] = m + 1;
    for (int i=0; i<m; ++i)         //预处理
        a[p[i]] = m - i; 
    
    int now = 0;
    while (now <= n - m) {
        if (memcmp(p, s + now, m) == 0)
            return now;
        now += a[s[now + m]];            
    }

    return -1;
}



Horspool算法

算法简介

Horspool同样是简化版的Boyer-Moore算法。该算法仅使用“坏字符”规则,字符串匹配时与Boyer-Moore算法一样,按从尾到头的顺序。

算法步骤

首先将字符串s与p头部对齐,开始以下步骤:

  1. 从p的尾部至头部开始逐一与s匹配

  2. 若匹配成功返回对应位置。若匹配失败,则聚焦到s与p匹配范围内的最后一个字符c(图中绿色框)。
    请添加图片描述

  3. 向右移动p,令p中除最后一位外最后出现的c与s中的c对齐,如果p中不存在c,则将整个p向后移动m位。回到步骤1,重复步骤1、2、3。

同理,在执行以上匹配操作前需要预处理:基于字符串p构造一个数组a,数组长度等于字符串中所有可能出现的字符数(一般为256),字符对应的数组元素为该字符在p中除最后一位外,最后出现的位置与字符串末端的距离,举个例子,字符串p为“abc”,则a[‘a’] = 2, a[‘b’] = 1, a[‘c’] = m = 3。其他未出现的字符对应的数组元素则统一赋值为p的长度。

代码

#define ALLCHAR 256

int Horspool(char *s, char *p) {
    int n = strlen(s), m = strlen(p);
    int a[ALLCHAR];
    
    for (int i=0; i<ALLCHAR; ++i)
        a[i] = m;
    for (int i=0; i<m-1; ++i)
        a[p[i]] = m-i-1;

    int now = 0;
    while (now <= n-m) {
        if (p[m-1]==s[now+m-1] && memcmp(p, s+now, m-1)==0)
            return now;
        now += a[s[now+m-1]];
    }
    return -1;
}



参考资料

EXACT STRING MATCHING ALGORITHMS

Quick Search algorithm

A VERV FAST SU6STRINC SEARCH ALGORITHM

Horspool algorithm

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

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

相关文章

IO流——字符缓冲流

复制文本文件–一次读写一个字符 –一次读写一个字符数组 不带参数&#xff1a; package com.demo03;import java.io.FileReader; import java.io.FileWriter; import java.io.IOException;/** 需求&#xff1a;* 把项目路径下的FileWriterDemo.java中的内容复制到项目路径…

上门服务小程序怎么开发-上门服务小程序源码功能

目前上门服务类型新型行业已经占据了很大的市场所在&#xff0c;上门家政服务&#xff0c;上门做饭&#xff0c;上门按摩&#xff0c;上门私教&#xff0c;上门美容没发等等一些列的&#xff0c;目前上门系列的在市场分额还是特别大的&#xff0c;趋势比较大&#xff0c;今天就…

Docker 安装镜像与使用命令

按照阿里云的操作文档安装 docker&#xff1a;https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 这里仅写 Windows 版的&#xff0c;其他版本见上面的链接 1. 安装&#xff0f;升级Docker客户端 对于Windows 10以下的用户&#xff0c;推荐使用Docker ToolboxWin…

一文带你了解UI自动化测试框架

PythonSeleniumUnittestDdtHTMLReport分布式数据驱动自动化测试框架结构 1、Business&#xff1a;公共业务模块&#xff0c;如登录模块&#xff0c;可以把登录模块进行封装供调用 ------login_business.py from Page_Object.Common_Page.login_page import Login_Page from H…

九龙证券|首月定增市场“开门红” 上市公司密集融资谋扩产

2023年首月&#xff0c;A股定增市场迎来“开门红”。 据上海证券报记者统计&#xff0c;年初至今&#xff0c;已有35家公司完成定增&#xff0c;合计募资986.86亿元&#xff0c;较上年同期的477.3亿元大幅增长超100%&#xff0c;延续了2022年末的高位运行态势。同时&#xff0c…

前端项目发布后,如何使正在使用的用户更新为最新的版本?

1.背景 每次项目上线后&#xff0c;异常监控总是零零散散报一些资源加载或者解析失败的告警 仔细对比chunk的hash值会发现已经是上一版本的js文件为什么会出现这个问题呢&#xff1f;也不难想到&#xff0c;项目是单页应用&#xff0c;页面使用懒加载分多个chunk打包&#xff…

SDP零信任网络安全架构

安全狗零信任SDP接入解决方案基于“以身份认证为中心&#xff0c;以信任为基础&#xff0c;持续动态授权认证”的理念&#xff0c;打造企业全方位立体业务访问安全体系。 其SDP零信任网络安全架构如下图&#xff1a; SDP零信任产品优势 1、多维度终端环境感知 系统风险感知&…

浅谈--声调

声调 根据声调的有无&#xff0c;我们可以把世界上的语言分为声调语言和非声调语言两大类。 非声调语言&#xff0c;并不是说音节没有高低升降的音高变化&#xff0c;只是这种变化只能改变语气作用&#xff0c;并不能区别意义。如&#xff1a;在英语单词book&#xff0c;音高…

Nacos 初始

1.Nacos 的安装使用。 nacos的安装步骤 1.端口配置 Nacos的默认端口是8848&#xff0c;如果你电脑上的其它进程占用了8848端口&#xff0c;请先尝试关闭该进程。 如果无法关闭占用8848端口的进程&#xff0c;也可以进入nacos的conf目录&#xff0c;修改配置文件中的端口&am…

(考研湖科大教书匠计算机网络)第三章数据链路层-第五节:点对点协议PPP

专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一&#xff1a;点对点协议&#xff08;PPP&#xff09;概述二&#xff1a;PPP协议组成部分三&#xff1a;PPP协议帧格式四&#xff1a;PPP协议的透明传输&#xff08;1&#xff09;字节填充法…

磨金石教育摄影技能干货分享|优秀摄影作品如何表现创意与思想的

在摄影活动中并不是简单的利用镜头把事物拍下来&#xff0c;而是要尽量的融入作者对当时当地事物的情意表达出来。利用摄影技术&#xff0c;因时制宜展现个人的创意&#xff0c;然后表达自己的思想。下面给大家分享一组摄影大赛获奖作品&#xff0c;看看这些获奖作品如何做到的…

vue(iviewui) 输入框历史记录

安装&#xff1a;npm install good-storage -S 缓存cache.js: /*把搜索的结果保存下来*/ /*用export把方法暴露出来*/ /*定义存储搜索的key _search_定义内部使用的key*/ let searches_list [] const SEARCH_MAX_LENGTH15 /*插入方法 arr存储的数据 val传入存储的值 comp…

leetcode-每日一题-1664-生成平衡数组的方案数(中等,动态规划)

时间长不做动态规划的题目&#xff0c;现在突然看过去有些生疏&#xff0c;第一眼看到这个题目想了一下暴力&#xff0c;然后突然注意到了题目的难度是中等&#xff0c;力扣里面的中等难度的题目都是没有暴力可以做出来的&#xff0c;目前我做这么多题来看的话&#xff0c;第一…

StarRocks荣获开源中国“2022 年度优秀开源技术团队”

近日&#xff0c;国内知名开源技术社区开源中国&#xff08;OSCHINA&#xff09;&#xff0c;综合了平台上各大认证官方技术团队、开源社区账号年度发表的内容频率及质量、开展各种活动运营积极性等多方面表现&#xff0c;向StarRocks颁发了 OSCHINA“2022年度优秀开源技术团队…

编译原理学习笔记19——语义分析和中间代码生成4

编译原理学习笔记19——语义分析和中间代码生成419.1 常用的控制语句19.2 控制语句的属性文法19.3 控制语句的属性计算19.4 一遍扫描翻译控制语句19.5 一遍扫描翻译控制语句示例19.1 常用的控制语句 常用的控制语句 S → if E then S1S → if E then S1 else S2S → while E …

机器学习笔记之生成对抗网络(二)全局最优解的求解逻辑

机器学习笔记之生成对抗网络——全局最优解的求解逻辑引言回顾&#xff1a;生成对抗网络的判别过程关于生成对抗网络的一些特性最优解的求解过程引言 上一节介绍了生成对抗网络&#xff0c;并介绍了其判别过程&#xff0c;本节将介绍关于模型参数的求解逻辑。 回顾&#xff1…

建立建筑领域科学的碳排放核算方法(江亿)

中国工程院院士、清华大学江亿教授受邀参加2022年12月28日“2022中国建筑节能协会年会暨第五届全国建筑节能与绿色建筑技术创新大会”并作了题为“建立建筑领域科学的碳排放核算方法”的报告。 实现能源转型&#xff0c;由碳基能源转为零碳能源&#xff0c;是中央确定的未来战…

九龙证券|锂离子电池在安全性能上应当满足哪些条件?

锂离子电池具有分量轻、容量大、无回忆效应等优势&#xff0c;因而得到了普遍运用——今朝的许多数码设备都采用了锂离子电池作电源&#xff0c;虽然其价格相对来说比较昂贵。锂离子电池的能量密度很高&#xff0c;它的容量是同分量的镍氢电池的1.5~2倍&#xff0c;而且具有很低…

Redis集群搭建

Redis集群搭建1.单机安装Redis2.Redis主从集群2.1.集群结构2.2.准备实例和配置2.3.启动2.4.开启主从关系2.5.测试3.搭建哨兵集群3.1.集群结构3.2.准备实例和配置3.3.启动3.4.测试4.搭建分片集群4.1.集群结构4.2.准备实例和配置4.3.启动4.4.创建集群4.5.测试基于CentOS7下的Redi…

数据库session分析表

目录 Active Session 活动会话 gv$active_session_history 每秒采集一次 dba_hist_active_sess_history 每10秒采集一次 背景 说明&#xff1a; 常用sql 直接使用V$ACTIVE_SESSION_HISTORY的sql 与其他表和视图共同查询…