浅析 Sunday 算法


背景


Sunday 算法是 Daniel M.Sunday 于 1990 年提出的字符串模式匹配。


其效率在匹配随机的字符串时比其他匹配算法还要更快。Sunday 算法的实现可比 KMP,BM 的实现容易太多。


算法过程


假定主串为 "HERE IS A SIMPLE EXAMPLE",模式串为 "EXAMPLE"。


(1)



从头部开始比较,发现不匹配。则 Sunday 算法要求如下:找到主串中位于模式串后面的第一个字符,即红色箭头所指的 “空格”,再在模式串中从后往前找“空格”,没有找到,则直接把模式串移到“空格” 的后面。


(2)



(3)



找到匹配。


完整代码


/**

*

* author : 刘毅(Limer)

* date   : 2017-07-30

* mode   : C++

*/

 

#include <iostream>

#include <string>

 

#define MAX_CHAR 256

#define MAX_LENGTH 1000

 

using namespace std;

 

void GetNext(string & p, int & m, int next[])

{

    for (int i = 0; i < MAX_CHAR; i++)

        next[i] = -1;

    for (int i = 0; i < m; i++)

        next[p[i]] = i;

}

 

void Sunday(string & s, int & n, string & p, int & m)

{

    int next[MAX_CHAR];

    GetNext(p, m, next);

 

    int j;  // s 的下标

    int k;  // p 的下标

    int i = 0;

    while (i <= n - m)

    {

        j = i;

        k = 0;

        while (j < n && k < m && s[j] == p[k])

            j++, k++;

 

        if (k == m)

            cout << "在" << i << " 处找到匹配\n";

 

        if (i + m < n)

            i += (m - next[s[i + m]]);

        else

            return;

    }

 

    // PS: 匹配失败不作处理

}

 

int main()

{

    string s, p;

    int n, m;

 

    while (cin >> s >> p)

    {

        n = s.size();

        m = p.size();

        Sunday(s, n, p, m);

        cout << endl;

    }

 

    return 0;

}


数据测试如下图:



来源:https://www.61mon.com/index.php/archives/213/


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

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

相关文章

.NET 6 Preview 1发布!

喜欢就关注我们吧&#xff01;.NET 6 首个预览版已发布&#xff0c;官方表示 .NET 6 的核心目标是完成从 .NET 5 开始的 .NET 统一计划的最后部分。此版本还将对 .NET 整体进行重大改进&#xff0c;包括针对云、桌面和移动应用程序的改进。.NET 6 计划于2021年11月正式发布&…

vba cad 获取宏的路径_VBA批量创建文件目录及链接,建议收藏备用

小伙伴们&#xff0c;之前有跟大家分享过Power Query获取文件夹内文件清单及其属性的方法【Excel快速获取文件列表及文件属性】。今天教大家通过VBA代码来实现同样的功能&#xff0c;提取文件夹内的文件信息更加灵活&#xff0c;只要选择对应的文件夹即可。实现效果操作方法&am…

纯JDBC系统的开发随想

纯JDBC系统的开发随想前两天&#xff0c;两个个纯后台应用项目在没有充分论证的情况下使用了SpringiBatis实现&#xff0c;从需求到实现、测试历经两天时间&#xff0c;实际代码开发时间是8小时&#xff0c;时间比较短&#xff0c;因为有以前的代码积累。再加上对框架熟烂于心&…

机器信息MachineInfo

不管是业务功能需要还是开发诊断需要&#xff0c;经常需要用到CPU内存硬盘等信息&#xff0c;或者需要主板编号和系统编号做唯一设备标识。于是设计了机器信息类 MachineInfo &#xff0c;支持Windows、Linux、Raspberry等。Nuget包&#xff1a;NewLife.Core源码地址&#xff1…

学习 Python 编程的 19 个资源

编译&#xff1a;wzhvictor&#xff0c;英文&#xff1a;codecondo segmentfault.com/a/1190000004187319用Python编写代码一点都不难&#xff0c;事实上它一直被赞誉为最容易学的编程语言。如果你准备学习web开发&#xff0c; Python是一个不错的开始&#xff0c;甚至想做游戏…

1155低功耗cpu排行_比拼浮点运算速度,超算排行榜是这样“算”出来的

本报记者 过国忠 通 讯 员 梅国英 吴 婷6月17日&#xff0c;新一期全球超算500强榜单出炉&#xff0c;入选500强的所有超算浮点运算速度都突破每秒千万亿次&#xff0c;中国超算也在前四占有两席位置。普通计算机用指令运算速度衡量计算性能&#xff0c;而超算通常用浮点运算速…

mysql 用户概念_传输概念 – db对象的用户/组/权限从mysql到postgresql

这似乎比stackoverflow更适合这里,所以这里&#xff1a;我一直在使用mysql一段时间以来,因为在大多数便宜的虚拟主机上,它是提供的数据库.但是,现在我开始认真开发Web应用程序,我一直在本地使用postgresql作为我的数据库,以便在我感到舒服时在客户端安装上正确使用它.我唯一没有…

在CSDN上的第一篇博客

大学三年在保研成功那一天算是画上了一个圆满的句号&#xff0c;但是这个句号并不代表我在大学里面学到了多少知识。相反&#xff0c;我常常为自己匮乏的专业知识而感到灰心丧气&#xff0c;甚至开始怀疑自己是否适合做IT这一行。大学期间成绩虽然不错&#xff0c;但是那仅仅只…

使用 Tye 辅助开发 k8s 应用竟如此简单(五)

使用 Tye 辅助开发 k8s 应用竟如此简单&#xff08;一&#xff09;使用 Tye 辅助开发 k8s 应用竟如此简单&#xff08;二&#xff09;使用 Tye 辅助开发 k8s 应用竟如此简单&#xff08;三&#xff09;使用 Tye 辅助开发 k8s 应用竟如此简单&#xff08;四&#xff09;续上篇&a…

详解冒泡排序

转自&#xff1a;静默虚空http://www.cnblogs.com/jingmoxukong/p/4302718.html要点冒泡排序是一种交换排序。什么是交换排序呢&#xff1f;交换排序&#xff1a;两两比较待排序的关键字&#xff0c;并交换不满足次序要求的那对数&#xff0c;直到整个表都满足次序要求为止。算…

java面向对象使用字符串_java面向对象中的String类中12种常用的方法

1、字符串与字符数组的转换字符串可以使用toCharArray()方法变成一个字符数组&#xff0c;也可以使用String类的构造方法把一个字符数组变成一个字符串。public class StringAPIDemo01{public static void main(String[] args){String str1 "hello"; //定义字符串ch…

python测试4_Python 各种测试框架简介(四):pytest

pytest 有时也被称为 py.test&#xff0c;是因为它使用的执行命令是 $ py.test。本文中我们使用 pytest 指代这个测试框架&#xff0c;py.test 特指运行命令。##较于 nose这里没有使用像前三篇一样(简介-举例-discovery-环境)式的分段展开&#xff0c;是因为 pytest 与 nose 的…

在Eigrp做不等值路由的负载均衡

在Eigrp做不等值路由的负载均衡 EIGRP Load Balancing 每个路由协议都支持等值路径的负载均衡.除此之外,IGRP和EIGRP也支持不等值路径的负载均衡,使用variance命令. Variance命令向路由器通告一个n值,n值使用variance命令指定.n值为1-128之间&#xff0c;默认为1。 网络拓扑 Va…

雪花算法Snowflake

雪花Id生成算法&#xff0c;是鼎鼎有名的分布式Id生成算法。它的优点在于&#xff0c;在分布式系统中快速生成有时间顺序的唯一编号&#xff01;Snowflake实测每秒可生成900万个唯一Id。Nuget包&#xff1a;NewLife.Core源码地址&#xff1a;https://github.com/NewLifeX/X/blo…

java爬取新浪微博登陆_30行jsoup代码搞定新浪微博登录抓取爬虫

主要是设置cookies 想知道方法的朋友可以留言哦爬虫问题都可以探讨哦import java.io.IOException;import java.util.HashMap;import java.util.Map;import org.jsoup.Connection;import org.jsoup.Connection.Method;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;p…

像小猪佩奇那样生活,需要多少钱?

每个有娃的家庭&#xff0c;几乎都有一个小猪佩奇的超级粉丝《小猪佩奇》&#xff08;又名《粉红猪小妹》&#xff09;史上最赚钱的英国学前电视动画片动画之一有网友从经济的角度算了笔账像佩奇一家那样生活需要多少钱呢&#xff1f;▼这是佩奇的家&#xff0c;视野相当不错的…

几何画板自定义工具_几何画板最强版 v5.06 中文版(含教程/实例/控件/打包机/工具集)...

相信还有很多地方的网课没有结束&#xff0c;前两天有小伙伴在后台留言求几何画板&#xff0c;这款软件大都收费&#xff0c;所以小软公然发到这里怕是不太稳妥&#xff0c;如果被删除就是被举报啦&#xff0c;需要的小伙伴速度下载保存~几何画板英文名&#xff1a;Sketchpad&a…

解惑3G业务

内容简介&#xff1a; 本书系统地介绍了第三代移动通信系统的业务&#xff0c;主要从业务概念、业务实现流程、关键技术、关键问题以及解决问题的思路几个角度进行介绍。本书内容包括&#xff1a;通信业务发展整体分析、3G的移动视频业务、基于SIP的移动“邀请”业务、移动位置…

Delphi 26 岁

喜欢就关注我们吧&#xff01;诞生于1995年的 Delphi 现在已经 26 岁了。1995年2月14日&#xff0c;Borland 公司推出了面向开发者的新工具——Delphi&#xff0c;旨在接替 DOS 时代盛行一时的 Turbo Pascal。说到这两款产品必然离不开它们的灵魂人物——Anders Hejlsberg&…

row number函数_Hive排名函数ROW_NUMBER,RANK 和 DENSE_RANK的区别

需求描述&#xff1a;分析最近三个月每天排名前30的邮箱收件数量。涉及到的表字段&#xff1a;发件时间&#xff0c;收件人。一、ROW_NUMBER表t查询出了3月每天不同类型邮箱收件量的降序排名&#xff0c;表t1通过ROW_NUMBER函数给每行数据添加序列号&#xff0c;select ROW_NUM…