之前被KMP的next数组搞的头昏脑胀说不上也是比较烦人的,今天看到还有这么有趣而且高效的算法(比KMP还快),看来有必要做一点笔记了

Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配算法,其简单、快速的特点非常好!

思路

其核心思想是:在匹配过程中,模式串发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提高了匹配效率;可以预见到,“跳过多个数”这个逻辑又可以写一个方法,然后被主函数调用

如果该字符没有在匹配串中出现则直接跳过,即移动步长= 匹配串长度+1;否则,同BM算法一样其移动步长=匹配串中最右端的该字符到末尾的距离+1

每一次移动前决定移动步长的是模式串末尾的下一个位置对应的主串字符

实现

//C语言

#include

#include

int getCurlA(char *tar, char ch, int curlA)

{

int *p = tar;

int delta = 0;

while(p && *p!=ch){

p++;

delta + = 1;

}

return curlA - delta;

}

int SundaySearch(char *src, char *tar)

{

int srcLen = strlen(src);

int tarLen = strlen(tar);

int curlA = curlB = 0;

while(src[curlA] == tar[curlB]){

if(curlB == tarLen-1){

return curlB - tarLen + 1;

}else{

curlA = getCurlB(&tar, src[curlA], curlB+1);

}

curlA++;

}

return -1;

}

sunday java_Sunday算法:最快的字符串匹配算法相关推荐

  1. KMP算法:最长字符串匹配算法

    KMP算法:最长字符串匹配算法 查找模式串在目标串中的位置 例如:目标串"asdasdaabbccaabsesdf" 模式串:"aabbccaabse" 则返回 ...

  2. 比KMP算法更简单更快的字符串匹配算法

    我想说一句"我日,我讨厌KMP!". KMP虽然经典,但是理解起来极其复杂,好不容易理解好了,便起码来巨麻烦! 老子就是今天图书馆在写了几个小时才勉强写了一个有bug的.效率不高的 ...

  3. Sunday算法---简单高效的字符串匹配算法

    说到字符串匹配算法,估计大伙立马就想到了KMP算法,谁让KMP这么经典呢,各种算法教材里必然有KMP啊.但是KMP算法太复杂了,求next崩溃到cry.难道就没有比KMP更简单更高效的算法,no,有的 ...

  4. 【算法与数据结构】字符串匹配算法

    文章目录 一.暴力穷解法 二.KMP算法 二.BM算法 三.Sunday算法 四.完整代码 所有的LeetCode题解索引,可以看这篇文章--[算法和数据结构]LeetCode题解. 一.暴力穷解法 ...

  5. Java实现算法导论中朴素字符串匹配算法

    朴素字符串匹配算法沿着主串滑动子串来循环匹配,算法时间性能是O((n-m+1)m),n是主串长度,m是字串长度,结合算法导论中来理解,具体代码参考: package cn.ansj;public cl ...

  6. Java实现算法导论中KMP字符串匹配算法

    "前缀"和"后缀". "前缀"指除了最后一个字符以外,一个字符串的全部头部组合:"后缀"指除了第一个字符以外,一个字符串 ...

  7. Java实现算法导论中有限自动机字符串匹配算法

    这里实现了基于有限自动机(Finite Automaton,FA)的模式匹配算法,算法的重点在于利用字符串的前后缀构造模式P的自动机,具体结合导论中的说明来理解,可参考http://www.geeks ...

  8. Java实现算法导论中Rabin-Karp字符串匹配算法

    Rabin-Karp算法的思想: 假设子串的长度为M,目标字符串的长度为N 计算子串的hash值 计算目标字符串中每个长度为M的子串的hash值(共需要计算N-M+1次) 比较hash值 如果hash ...

  9. sunday java_SunDay算法java实现

    Sunday算法java实现 Sunday算法由Daniel M.Sunday在1990年提出,它的思想跟BM算法很相似: 只不过Sunday算法是从前往后匹配,在匹配失败时关注的是文本串中参加匹配的 ...

最新文章

  1. 哪里可以找到python的免费教程-哪里可以找到比较靠谱的Python教程?
  2. 链接脚本使用----- 将二进制文件作为一个段
  3. c++远征之继承篇——继承的概念、继承时构造函数/析构函数的先后顺序
  4. LeetCode 378. 有序矩阵中第K小的元素(二分查找)
  5. 软链接文件和硬链接文件
  6. ais信号接收设备_基于USRP的AIS接收机实现
  7. 我有几个粽子,和一个故事
  8. ubuntu java 中文_java部署ubuntu后中文显示问号问题
  9. 解决最新版chrome不能安装IDM插件IDMGCExt.crx的问题
  10. DIV+CSS+JavaScript的简单运用
  11. 【杭电5053】the Sum of Cube
  12. openGL使用高度贴图模拟地球表面凹凸效果
  13. sql排序,null排在最前/最后----mysql排序之if(isnull(字段名),0,1),fild 或者 if(isnull(字段名),1,0),fild
  14. python3下操作SVN
  15. c语言搭积木游戏,我们一起搭积木,做游戏,就这就简单
  16. 如何向 Windows 7 镜像中添加 USB3.0 驱动
  17. P2905 [USACO08OPEN]农场危机Crisis on the Farm
  18. 在C语言二级考试中编程题编译,二级C语言上机编程题
  19. 【计算机视觉】全息投影技术
  20. 基础知识夯实day10:Javabean

热门文章

  1. Django ajax 检测用户名是否已被注册
  2. sqlserver学习3---sql函数
  3. 20165320 第九周学习总结
  4. Python【01】【基础部分】- A
  5. 图像连通域标记算法研究
  6. 面试总结之html+css
  7. 列表异步线程加载图片
  8. Extjs checkbox 多删除
  9. java.util.Properties
  10. vue-cli 打包