Sunday算法

Sunday 算法于 1990 年 Daniel M.Sunday 提出的字符串模式匹配。其效率在匹配随机的字符串时比其他匹配算法还要更快。Sunday 算法的实现可比 KMP,BM 的实现容易太多,而且速度上也是快上两三倍。

核心思想

在匹配过程中,不需要模式字符串以确保从左到右或从右到左按比较以比较发现不匹配,算法可以跳过尽可能多的字符进行下一个匹配,从而提高了匹配效率。

具体原理操作如下:

假设

str1:abcceabcaabcd

str2:abcd

str1_len = str1.length();

str2_len = str2.length();

从头开始str1 与 str2 以此匹配,找不到C和d匹配。不匹配时则查看 str2字符串 的后一位字符 (即e),发现str2字符没有一个与之相同的,此时,需要跳过一大片的字符,即到达str2_len+1的后一个字符开始匹配(即a)

str1:abcceabcaadsdabcd

str2:-----abcd

从str1的a开始匹配,但在相对于a的第二个字符却与str2不匹配,所以又查看str2字符串的后一位字符现a字符与str2的第一个字符匹配,所以str2字符串需要偏移到跟str1字符串相匹配的位置,重复步骤,相对于第一个字符(a)的的第二个位置(即d)但与之不匹配,所以又查看str2字符串的后一位字符(即a)。

str1:abcceabcaadsdabcd

str2:-------------- abcd

发现a字符与str2的第一个字符匹配,所以str2字符串需要偏移到跟str1字符串相匹配的位置,但是现在在str1相对于第一个字符(a)的的第二,三,四的位置都与str2的z字符相匹配。所以匹配成功

str1:abcceabcaadsdabcd

str2:-------------------- abcd

若是觉得我解释的不清楚的话:这个是大神的博客,附有图片解释,或许会更好

int test(const string str1, const string str2){

int str1_len = str1.length();

int str2_len = str2.length();

int i = 0, j = 0;

long int index = 0; //下标

while(index < str1_len - str2_len){

//这个主要两个字符串的比较,比较是否全等。

for (; i

//表示全等的过程

if(i == str2_len - 1){

return index + 1;

}

//若是有一个不对等。。那么久没必要再循环了,直接退出

if(str2[i] != str1[index + i]){

break;

}

}

//z这个主要是上面匹配不成功的话,我们就要把下标index偏移到str2的后面

for (j = 0; j < str2_len; ++j) {

if(str2[j] == str1[index + str2_len]){

//这里设置偏移量

index += str2_len -j;

break;

}

if(j == str2_len -1){

index += str2_len ;

}

}

}

cout << "没有匹配到包含的字符串" << endl;

}

运算结果

0a36abc3c661062c02ba740629f5d51.png

注意

这个字节写的代码是在102400个字节内能查询到,再多的话就会导致查询失败。以后我会继续完善的。

百度大佬的代码

//注意这里的数据大小可以更改,当时为了测试长文本给改成那么大、

#define MAX_CHAR 25600

#define MAX_LENGTH 100000

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;

bool is_find = false;

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";

is_find = true;

}

if (i + m < n)

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

else

break;

}

if (!is_find)

cout << "未找到匹配\n";

}

大神的代码测试:

7c2064375e21d7e5d9de50922a5ef0a.png

注意

大神的代码速度都差不多,但是稳定性更强,更加的优化,这个是我值得借鉴的地方。

计算代码运行时间

#include

int main()

{

clock_t start,end;

start=clock();

函数体

end=clock();

//C语言

printf("totile time=%f\n",(float)(end-start)*1000/CLOCKS_PER_SEC);

//CPP

cout << "time: " << (float)(end-start)/CLOCKS_PER_SEC << "s" << endl;

总结

感觉在此次学习过程中,应用的也只是基础的C语言,CPP语言的知识

我可以改进的地方:

偏移量应该,写一个偏移量表来的

在查询字符串中是否包含单字符的中,,应该单独拿出 二分查询法,提高查询效率。

3.等过后应该多看一下网上大神的代码,是如何实现的

最后

不知道不同人运行的不同编译器是否会出现错,若是遇到错误的地方,欢迎留言。若是你有更好的,更有效率的方法,也欢迎留言告知,大家一起进步,一起讨论、可以相互关注,相互学习

sunday算法c语言实现,C / C++学习笔记:实现Sunday算法相关推荐

  1. R语言与机器学习学习笔记(分类算法)

    转载自:http://www.itongji.cn/article/0P534092014.html 人工神经网络(ANN),简称神经网络,是一种模仿生物神经网络的结构和功能的数学模型或计算模型.神经 ...

  2. c语言编程实例解析精粹,C语言实例解析精粹学习笔记——35(报数游戏)

    实例35: 设由n个人站成一圈,分别被编号1,2,3,4,--,n.第一个人从1开始报数,每报数位m的人被从圈中推测,其后的人再次从1开始报数,重复上述过程,直至所有人都从圈中退出. 实例解析: 用链 ...

  3. R语言与抽样技术学习笔记(Jackknife)

    R语言与抽样技术学习笔记(Randomize,Jackknife,bootstrap) Jackknife算法 Jackknife的想法在我很早的一篇博客<R语言与点估计学习笔记(刀切法与最小二 ...

  4. R语言与函数估计学习笔记(函数模型的参数估计)

    R语言与函数估计学习笔记 毫无疑问,函数估计是一个比参数估计要复杂得多的问题,当然也是一个有趣的多的问题.这个问题在模型未知的实验设计的建模中十分的常见,也是我正在学习的内容的一部分. 关于函数估计我 ...

  5. 《基于张量网络的机器学习入门》学习笔记8(Shor算法)

    <基于张量网络的机器学习入门>学习笔记8 Shor算法 来源 Shor算法的大致流程 因数分解 周期求取与量子傅里叶变换(QFT) Shor算法 来源 1994 1994 1994年,应用 ...

  6. 【学习笔记】【算法】【智能优化】粒子群优化(PSO)

    [学习笔记][算法][智能优化]粒子群优化(PSO) 文章目录 [学习笔记][算法][智能优化]粒子群优化(PSO) 1 算法背景 1.1 背景 1.2 基础知识 2 算法原理 2.1 基本原理 2. ...

  7. 【学习笔记】网络流算法简单入门

    [学习笔记]网络流算法简单入门 [大前言] 网络流是一种神奇的问题,在不同的题中你会发现各种各样的神仙操作. 而且从理论上讲,网络流可以处理所有二分图问题. 二分图和网络流的难度都在于问题建模,一般不 ...

  8. 点云学习笔记11——VoxelNet算法+代码运行

    点云学习笔记11--VoxelNet算法+代码运行 一.算法分析 摘要 介绍 相关工作 1.2. 贡献 2.VoxelNet 2.1.特征学习网络 2.1.1 特征学习网络 二.代码复现 2.1.环境 ...

  9. c语言/c++转Java学习笔记---基础问题

    c语言/c++转Java学习笔记---基础问题 1.java注释 2.数组的定义和使用 定义 使用 3.类 4.this 的使用 5.继承 6.super的使用 7.包 8.修饰符 成员的访问控制符( ...

最新文章

  1. 深度学习加速器堆栈Deep Learning Accelerator Stack
  2. Shadow Brokers扬言兜售新漏洞攻击工具
  3. ubuntu下安装php redis
  4. 从面试官问“为什么选择mysql数据库”说开去
  5. 交换最小值和最大值 (15 分)
  6. 网页导出pdf不完整_今天才知道!Word、Excel、PDF格式还能随意转换,20秒即可实现...
  7. CentOS操作系统keepalived安装步骤
  8. 常见Linux版本概览
  9. 大数据十大核心原理(互联网上整理)
  10. Java期末复习——知识点+题库
  11. HTML+CSS简单的网页制作期末作业 关于我的家乡——四川文化网页介绍 DW大学生网页作业制作设计 Dreamweaver简单网页成品
  12. 机电一体化仿真--手爪
  13. c++ opencv 彩色图rgb 转换hsv 再通道分离
  14. Filter为什么会在一次请求执行多次doFilter?
  15. android有道翻译代码,Android使用有道翻译API实如今线翻译功能(示例代码)
  16. java中ofd文件转pdf_ofd格式如何转换成word
  17. IncorrectResultSizeDataAccessException: Incorrect result size: expected 1, actual 2
  18. 参加csdn活动有感
  19. minecraft 局域网联机问题一个可能的解决办法
  20. 参加大数据培训之后就业情况怎么样?

热门文章

  1. 自媒体新手入门攻略,学习干货内容了解运营技巧
  2. 2017acm乌鲁木齐赛区网络赛F题tarjan缩点
  3. 集美大学计算机课程考试系统,计算机系统结构-集美大学考试内容.docx
  4. 炮弹仿真系统matlab软件下载,基于Matlab/Simulink的导弹六自由度弹道仿真系统设计...
  5. CodeForces612AThe Text Splitting(模拟,暴力枚举)
  6. 简洁易用的记账小程序——微点记账
  7. Python手机号码归属地查询
  8. Shadow DOM 样式隔离 js沙箱
  9. CSDN博客背景皮肤设置
  10. 看一看,赋能智慧城市,京东方亮相北京市建筑设计研究院创新日活动