比起流行的kmp算法,  Sunday不仅搜索效率上要高很多, 而且原理还特别简单易理解,  也容易实现.

字符串匹配——Sunday算法

基本思想及举例

Sunday算法由Daniel M.Sunday在1990年提出,它的思想跟BM算法很相似.

Sunday算法是:从前往后匹配,在匹配失败时关注的是主串中参加匹配的最末位字符的下一位字符。

i

n

s

t

r

o

i

u

c

t

i

o

n

x

y

i

u

c

如果该字符没有在模式串中出现则直接跳过,即移动位数 = 模式串长度 + 1;

否则,其移动位数 = 模式串长度 - 该字符最右出现的位置(以0开始) = 模式串中该字符最右出现的位置到尾部的距离 + 1。

下面举个例子说明下Sunday算法。假定现在要在主串”instroiuctionxy”中查找模式串”iuc”。

刚开始时,把模式串与文主串左边对齐:

结果发现在第2个字符处发现不匹配,不匹配时关注主串中参加匹配的最末位字符的下一位字符,即标红的字符 t,因为模式串iuc中并不存在t,所以模式串直接跳过一大片,向右移动位数 = 匹配串长度 + 1 = 3 + 1 = 4,从t 之后的那个字符(即字符r)开始下一步的匹配,如下图:

结果第一个字符就不匹配,再看主串中参加匹配的最末位字符的下一位字符,是u,它出现在模式串中的倒数第2位,于是把模式串向右移动1位(3 - 2 ),使两个’u’对齐,如下:

匹配成功。

回顾整个过程,我们只移动了两次模式串就找到了匹配位置,缘于Sunday算法每一步的移动量都比较大,效率很高。

====================================================================

c   语言实现代码:

#include

#include

const int NUM=256;

int sunday(const char* src, const char* des)

{

unsigned char  jump[NUM];    //映射表   被搜寻字符的ascii码作为jump数组元素的下标---> 元素的值是模式串中该字符对应的主字符串移动位数

int  len_d =strlen(des);

int  len_s = strlen(src);

for(int p = 0; p < NUM; p++) {   //构建映射表,给所有字符对应跳动的位数赋最大值=模式字符串的长度+1

jump[p] = len_d + 1;

}

for(int k = 0; k < len_d; k++) {  k是模式字符串中字符的位置,  jump数组中相应字符对应的值= 模式字符串长度-k

jump[des[k]] = len_d - k;

}

int j=0;

int pos=0;

int end=len_s-len_d;

while(pos<=end) {

j=0;

while( src[pos+j]==des[j]) //主字符串与模式字符串比较

{

j++;

if(j>=len_d)

return pos;

}

//由于src中有可能有汉字,  src[pos+len_d] 有可能是汉字双字节中的一个字节, 则可能为负数, 作为下标代入jump数组时, 造成数组越界,因此要将

// src[pos+len_d] 强制转化为无符号整数

pos=pos+jump[ (unsigned char)(src[pos+len_d]) ];   //字符串指针跳动

}

return  -1;

}

int main()

{

char  s[]="faddd3fgh4wgfh[ 得齄grcp3";

char  d[]="得齄";

int pos= sunday(s,d);

printf("pos=%d\n",pos);

return 0;

}

sunday算法c语言实现,字符串搜索的Sunday算法相关推荐

  1. C语言之字符串搜索以及替换

    字符串搜索以及替换 刚开始摸爬打滚的登上了求职的路上,经历了无数的面试以及笔试.至今还没有着落.经验已经积累了一些,今天在这里写详细分析一下我在笔试当中遇到的一个高频考题.没错,就是本章的题目,字符串 ...

  2. 【数据结构与算法——C语言版】1. 数据结构与算法简介

    概念 数据结构:"一组数据的存储结构" 算法:"操作数据的一组方法" 数据结构是为算法服务的,算法是要作用再特定的数据结构上的. 简言之,在编程实践中,我们可能 ...

  3. php 红包算法,PHP语言:实现微信红包拆分算法

    本文主要向大家介绍了PHP语言:实现微信红包拆分算法,通过具体的内容向大家展示,希望对大家学习php语言有所帮助. · 修复最后一个红包输出未保留2位数 · 修复领取的红包金额低于最小红包限制 * 红 ...

  4. 人工免疫算法c语言实例,毕业设计_蚁群算法模拟系统的设计与实现.doc

    J I A N G S U U N I V E R S I T Y 本 科 毕 业 论 文 蚁群算法模拟系统的设计与实现 Ant Colony Simulation System Design and ...

  5. 栅格法路径算法C语言,基于地图栅格与QPSO算法结合的机器人路径规划方法与流程...

    本发明属于机器人路径规划领域,提出一种基于地图栅格与QPSO结合的机器人路径规划方法. 背景技术: 移动机器人路径规划是寻找一条无碰撞的可行路径问题的方法.近些年,群智能优化算法逐渐成为移动机器人路径 ...

  6. 机械臂运动学算法c语言,6轴工业机械臂运动学算法(C++) 六轴机械臂运动学源码 - 下载 - 搜珍网...

    6轴工业机械臂运动学算法 6轴工业机械臂运动学算法\.cproject 6轴工业机械臂运动学算法\.project 6轴工业机械臂运动学算法\.settings 6轴工业机械臂运动学算法\.setti ...

  7. 极值跟踪算法 c语言,快速约束极值子空间跟踪算法_魏志强.pdf

    快速约束极值子空间跟踪算法_魏志强 34 4 Vol. 34 No. 4 第 卷第 期 华 北 水 利 水 电 学 院 学 报 2013 8 Journal of North China Instit ...

  8. pbkdf2 算法 C语言实现,密码学基础之PBKDF2算法

    站点登录需要输入用户名和密码,而密码属于个人敏感数据,应当只保存密码的单向哈希值.简单的哈希值,无法防止彩虹表攻击,使用基于口令的密钥派生算法PBKDF2可以解决这种问题. PBKDF2 需要以下输入 ...

  9. 字符串搜索之BMH 算法(伪代码)

    天哪,算法复杂度越来越低了,连线性的都不用了!!O(n-m)!!从后往前扫的功效!!(要匹配的字符) 逆简单算法 • 如果从P的后面开始搜索? – Boyer and Moore Reverse-Na ...

最新文章

  1. UVA 10515 - Powers Et Al.(数论)
  2. APUE(第四章)文件和目录
  3. 分享超酷的添加图片悬浮特效jQuery插件 - Adipoli
  4. 华为重磅反击,鸿蒙来了!
  5. IdentityServer4系列 | 简化模式
  6. 初识c++中的函数模板
  7. 解决 An invalid domain was specified for this cookie
  8. 【Matlab学习笔记】【细胞或颗粒检测分割】资源汇总
  9. PHP编写时的灵活性
  10. gradle mysql方言_基于Spring Boot技术栈的博客系统企业级实战教程分享
  11. sts 工具下载与安装
  12. cdr添加节点快捷键_cdr x6快捷键大全 cdr x6(coreldraw x6)快捷键汇总
  13. 安装win10虚拟机遇到的坑
  14. 保护海洋主题的微信公众号图文排版必备素材集锦
  15. 数据洪流时代,企业转型需要修建自己的“都江堰”
  16. JAVA疫情数据项目(JAVA课程设计)
  17. 训练集、验证集、测试集的作用和区别
  18. 超图对接伟景行osg数据使用说明
  19. 《山海经——五藏山经》
  20. BootStrap 统计分析 浅析

热门文章

  1. 腾讯可视化, 低代码生成器,正式开源!
  2. 江水平:我是如何通过互联网做装修生意的
  3. 520表白节 用代码写出你对女神的爱
  4. Java 在PPT中创建SmartArt图形、读取SmartArt图形中的文本
  5. mysql批量修改字段名(列名)
  6. Basics(基础)
  7. Unity热更新技术学习——AssetsBundle详解
  8. 东方博宜OJ 1391 - 【入门】公交卡充值问题?
  9. C#时间格式 AM\ PM
  10. 微信小程序this.data赋值时,页面视图层没有同步更新