这个算法比其他的kmp  bm 好理解的太多,而且速度还很快。

sunday思路是:

1,Sunday算法是Daniel M.Sunday于1990年提出的一种比BM算法搜索速度更快的算法。 



2,Sunday算法其实思想跟BM算法很相似,只不过Sunday算法是从前往后匹配,在匹配失败时关注的是文本串中参加匹配的最末位字符的下一位字符。如果该字符没有在匹配串中出现则直接跳过,即移动步长= 匹配串长度+ 1;否则,同BM算法一样其移动步长=匹配串中最右端的该字符到末尾的距离+1。 



3,举例: 



匹配串:abcbczdxzc 

模式串:zbcac 



这里我们看到z-a没有对上,我们就看匹配串中的z在模式串的位置,然后对齐。 

匹配串:abcbczdxzc 

模式串:         zbcac 



如果模式串中的没有那个字符的话就跳过去。 

匹配串:abcbcedxzcs 

模式串:zbcac 

e不在模式串中出现,那么我们就 

匹配串:abcbcedxzcs 

模式串:           zbcac

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int Sunday(char text[],char pattern[])
  6. {
  7. int i = 0;
  8. int j = 0;
  9. int pos = -1;
  10. while(i < strlen(text) && j < strlen(pattern))
  11. {
  12. if(text[i] == pattern[j])
  13. {
  14. i++;
  15. j++;
  16. }
  17. else
  18. {
  19. int k = strlen(pattern) - 1;
  20.  
  21. while(k >= 0)
  22. {
  23. if(text[i+strlen(pattern)+1]==pattern[k])
  24. {
  25. break;
  26. }
  27. else
  28. {
  29. k--;
  30. }
  31. }
  32. i += (strlen(pattern) - (k+1)+1);
  33. j = 0;
  34. }
  35. }
  36.  
  37. printf("j is %d i is %d\n",j,i);
  38. printf("%d\n",strlen(text));
  39.  
  40. if(i==strlen(text))
  41. {
  42. return pos;
  43. }
  44. else {
  45. return -1;
  46. }
  47. }
  48.  
  49. int main(void)
  50. {
  51. char text[] = "ABC ABCDAB ABCDABCDABDE";
  52. char pattern[] = "ABCDABD";
  53. char *ch = text;
  54. int i = Sunday(text, pattern);
  55.  
  56. if(i >= 0) printf("matched@: %s\n", ch + i);
  57. printf("pos is %d\n",i);
  58.  
  59. return 0;
  60. }
  1.  
  1. 有点小小的问题 ,但是思路没有问题,写在博客中督促自己再次将它简洁地实现出来

sunday算法实现的更多相关文章

  1. 文本比较算法三——SUNDAY 算法

    SUNDAY 算法描述: 字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上 ...

  2. 字符串匹配的sunday算法

    sunday算法核心思想:启发式移动搜索步长! SUNDAY 算法描述: 字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).这里介 ...

  3. Sunday算法(字符串查找、匹配)

    字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上,KMP算法并不比最简单的 ...

  4. 字符串模式匹配sunday算法

    文字部分转自:http://www.cnblogs.com/mr-ghostaqi/p/4285868.html 代码是我自己写的 今天在做LeetCode的时候,碰到一个写字符串匹配的题目: htt ...

  5. 字符串匹配算法之Sunday算法

    字符串匹配查找算法中,最着名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上,KMP算法并不比最简 ...

  6. BF、KMP、BM、Sunday算法讲解

    BF.KMP.BM.Sunday算法讲解 字串的定位操作通常称作串的模式匹配,是各种串处理系统中最重要的操作之一. 事实上也就是从一个母串中查找一模板串,判定是否存在. 现给出四种匹配算法包括BF(即 ...

  7. 字符串查找算法总结(暴力匹配、KMP 算法、Boyer-Moore 算法和 Sunday 算法)

    字符串匹配是字符串的一种基本操作:给定一个长度为 M 的文本和一个长度为 N 的模式串,在文本中找到一个和该模式相符的子字符串,并返回该字字符串在文本中的位置. KMP 算法,全称是 Knuth-Mo ...

  8. 数据结构 Sunday算法

    Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配算法.相对比较KMP和BM算法而言,简单了许多. Sunday算法的思想类似于BM算法中的坏字符思想,有点像其删减版.差 ...

  9. 字符串匹配 - sunday算法

    常见的字符串匹配算法有BF.KMP(教科书中非常经典的).BM.Sunday算法 这里主要想介绍下性能比较好并且实现比较简单的Sunday算法 . 基本原理: 从前往后匹配,如果遇到不匹配情况判断母串 ...

随机推荐

  1. C#类、静态类

    C#是面向对象(object-oriented)类型的计算机语言,使用类(class)来体现面向对象的概念. 分类(classification) 我们在现实世界中,会遇到很多被分类的事物.例如,动物 ...

  2. java泛型方法

    Tool.java package cn.stat.p9.fanxing.demo; public class Tool<QQ> {//不确定类型时可以用泛型 private QQ q; ...

  3. KM算法专题

    原文:http://972169909-qq-com.iteye.com/blog/1184514 题目地址:这里. 1)求图中所有环的总长度(环的长度不唯一)的最小值.当无法得到完备匹配时说明环不存 ...

  4. 011_hasCycle

    /* * Author :SJQ * * Time :2014-07-16-20.21 * */ #include <iostream> #include <cstdio> # ...

  5. 《Hadoop权威》学习笔记四:Hadoop的I/O

    一.数据完整性   二.压缩   三.序列化 基本概念 序列化指的是将结构化对象转化为字节流以便于通过网络进行传输或写入持久化存储的过程 反序列化指的是将字节流转为一系列结构化对象的过程. 进程间通信 ...

  6. xode 中文乱码处理

    find *.* -exec sh -c "iconv -f GB18030 -t UTF-8 {} > {}.txt" \;

  7. Linux下的管道命令有这些:

    Linux下的管道命令有这些: 选取命令:cat grep 排序命令:sort wc uniq 双向重定向:tee 字符转换命令: tr, col, join, paste, expand 切割命令: ...

  8. Android学习笔记--Broadcast, BroadcastReceiver(广播)

    参考资料:http://www.cnblogs.com/playing/archive/2011/03/23/1992030.html 在 Android 中使用 Activity, Service, ...

  9. shell编程技术之-基础知识

    一.脚本结构 linux下shell的脚本,是将一系列命令序列写在一个文本文件,而这个文本文件时可执行的.相对命令行来说,开发效率提高.因此他的构架有2部分构成#!和命令序列.其中#!指明此脚本是用哪 ...

  10. cf C. Dima and Containers

    http://codeforces.com/contest/358/problem/C 将最大的放在stack里面,第二大的放在queue中,第三大的放在deck里面.然后模拟就可以了. #inclu ...