sunday算法c语言实现,字符串搜索的Sunday算法
比起流行的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算法相关推荐
- C语言之字符串搜索以及替换
字符串搜索以及替换 刚开始摸爬打滚的登上了求职的路上,经历了无数的面试以及笔试.至今还没有着落.经验已经积累了一些,今天在这里写详细分析一下我在笔试当中遇到的一个高频考题.没错,就是本章的题目,字符串 ...
- 【数据结构与算法——C语言版】1. 数据结构与算法简介
概念 数据结构:"一组数据的存储结构" 算法:"操作数据的一组方法" 数据结构是为算法服务的,算法是要作用再特定的数据结构上的. 简言之,在编程实践中,我们可能 ...
- php 红包算法,PHP语言:实现微信红包拆分算法
本文主要向大家介绍了PHP语言:实现微信红包拆分算法,通过具体的内容向大家展示,希望对大家学习php语言有所帮助. · 修复最后一个红包输出未保留2位数 · 修复领取的红包金额低于最小红包限制 * 红 ...
- 人工免疫算法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 ...
- 栅格法路径算法C语言,基于地图栅格与QPSO算法结合的机器人路径规划方法与流程...
本发明属于机器人路径规划领域,提出一种基于地图栅格与QPSO结合的机器人路径规划方法. 背景技术: 移动机器人路径规划是寻找一条无碰撞的可行路径问题的方法.近些年,群智能优化算法逐渐成为移动机器人路径 ...
- 机械臂运动学算法c语言,6轴工业机械臂运动学算法(C++) 六轴机械臂运动学源码 - 下载 - 搜珍网...
6轴工业机械臂运动学算法 6轴工业机械臂运动学算法\.cproject 6轴工业机械臂运动学算法\.project 6轴工业机械臂运动学算法\.settings 6轴工业机械臂运动学算法\.setti ...
- 极值跟踪算法 c语言,快速约束极值子空间跟踪算法_魏志强.pdf
快速约束极值子空间跟踪算法_魏志强 34 4 Vol. 34 No. 4 第 卷第 期 华 北 水 利 水 电 学 院 学 报 2013 8 Journal of North China Instit ...
- pbkdf2 算法 C语言实现,密码学基础之PBKDF2算法
站点登录需要输入用户名和密码,而密码属于个人敏感数据,应当只保存密码的单向哈希值.简单的哈希值,无法防止彩虹表攻击,使用基于口令的密钥派生算法PBKDF2可以解决这种问题. PBKDF2 需要以下输入 ...
- 字符串搜索之BMH 算法(伪代码)
天哪,算法复杂度越来越低了,连线性的都不用了!!O(n-m)!!从后往前扫的功效!!(要匹配的字符) 逆简单算法 • 如果从P的后面开始搜索? – Boyer and Moore Reverse-Na ...
最新文章
- UVA 10515 - Powers Et Al.(数论)
- APUE(第四章)文件和目录
- 分享超酷的添加图片悬浮特效jQuery插件 - Adipoli
- 华为重磅反击,鸿蒙来了!
- IdentityServer4系列 | 简化模式
- 初识c++中的函数模板
- 解决 An invalid domain was specified for this cookie
- 【Matlab学习笔记】【细胞或颗粒检测分割】资源汇总
- PHP编写时的灵活性
- gradle mysql方言_基于Spring Boot技术栈的博客系统企业级实战教程分享
- sts 工具下载与安装
- cdr添加节点快捷键_cdr x6快捷键大全 cdr x6(coreldraw x6)快捷键汇总
- 安装win10虚拟机遇到的坑
- 保护海洋主题的微信公众号图文排版必备素材集锦
- 数据洪流时代,企业转型需要修建自己的“都江堰”
- JAVA疫情数据项目(JAVA课程设计)
- 训练集、验证集、测试集的作用和区别
- 超图对接伟景行osg数据使用说明
- 《山海经——五藏山经》
- BootStrap 统计分析 浅析