本文代码下载地址

http://download.csdn.net/detail/sun2043430/5273911

Sunday算法思路

Sunday算法的思想和BM算法中的坏字符思想非常类似。

差别只是在于Sunday算法在失配之后,是取目标串中当前和模式串对应的部分后面一个位置的字符来做坏字符匹配。
如下图:
下标数:01234567890
目标串:abcdefghijk
模式串:bxcd
BM算法在b和x失配后,坏字符为b(下标1),在模式串中寻找b的位置,找到之后就对应上,移到下面位置继续匹配。
目标串:abcdefghijk
模式串: bxcd
而在sunday算法中,对于上面的匹配,发现失配后,是取目标串中和模式串对应部分后面的一个字符,也就是e,然后用e来做坏字符匹配。
e在模式串中没有,所以使用sunday算法,接下来会移动到下面的位置继续匹配。
目标串:abcdefghijk
模式串:     bxcd
从这里可以看出,Sunday算法比BM算法的位移更大,所以Sunday算法比BM算法的效率更高。但是最坏的时间复杂度仍然有o(目标串长度*模式串长度)。考虑这样的目标串:baaaabaaaabaaaabaaaa,要在里面搜索aaaaa,显然是没有匹配位置。但是如果用Sunday算法,坏字符大部分都是a,而模式串中又全部都是a,所以在大部分情况下,发现失配后模式串只能往右移动1位。而如果用改进的KMP算法,仍然是可以保证线性时间内匹配完。
另外,使用Sunday算法不需要固定地从左到右匹配或者从右到左的匹配(这是因为失配之后我们用的是目标串中后一个没有匹配过的字符), 我们可以对模式串中的字符出现的概率事先进行统计,每次都使用概率最小的字符所在的位置来进行比较,这样失配的概率会比较大,所以可以减少比较次数,加快匹配速度。
如下面的例子:
目标串:abcdefghijk
模式串:aabcc
模式串中b只出现了一次,a,c都出现了2次,所以我们可以先比较b所在的位置(只看模式串中的字符的话,b失配的概率会比较大)。
总之,Sunday算法简单易懂,思维跳出常规匹配的想法,从概率上来说,其效率在匹配随机的字符串时比其他匹配算法还要更快。

完整的Sunday算法

#include <stdio.h>
#include <string.h>bool BadChar(const char *pattern, int nLen, int *pArray, int nArrayLen)
{if (nArrayLen < 256){return false;}for (int i = 0; i < 256; i++){pArray[i] = -1;}for (int i = 0; i < nLen; i++){pArray[pattern[i]] = i;}return true;
}int SundaySearch(const char *dest, int nDLen,const char *pattern, int nPLen,int *pArray)
{if (0 == nPLen){return -1;}for (int nBegin = 0; nBegin <= nDLen-nPLen; ){int i = nBegin, j = 0; for ( ;j < nPLen && i < nDLen && dest[i] == pattern[j];i++, j++);if (j == nPLen){return nBegin;}if (nBegin + nPLen > nDLen){return -1;}else{nBegin += nPLen - pArray[dest[nBegin+nPLen]];}}return -1;
}void TestSundaySearch()
{int         nFind;int         nBadArray[256]  = {0};//        1         2         3         4//0123456789012345678901234567890123456789012345678901234const char  dest[]      =   "abcxxxbaaaabaaaxbbaaabcdamno";const char  pattern[][40] = {"a","ab","abc","abcd","x","xx","xxx","ax","axb","xb","b","m","mn","mno","no","o","","aaabaaaab","baaaabaaa","aabaaaxbbaaabcd","abcxxxbaaaabaaaxbbaaabcdamno",};for (int i = 0; i < sizeof(pattern)/sizeof(pattern[0]); i++){BadChar(pattern[i], strlen(pattern[i]), nBadArray, 256);nFind = SundaySearch(dest, strlen(dest), pattern[i], strlen(pattern[i]), nBadArray);if (-1 != nFind){printf("Found    \"%s\" at %d \t%s\r\n", pattern[i], nFind, dest+nFind);}else{printf("Found    \"%s\" no result.\r\n", pattern[i]);}}}int main(int argc, char* argv[])
{TestSundaySearch();return 0;
}

输出结果:

Found    "a" at 0       abcxxxbaaaabaaaxbbaaabcdamno
Found    "ab" at 0      abcxxxbaaaabaaaxbbaaabcdamno
Found    "abc" at 0     abcxxxbaaaabaaaxbbaaabcdamno
Found    "abcd" at 20   abcdamno
Found    "x" at 3       xxxbaaaabaaaxbbaaabcdamno
Found    "xx" at 3      xxxbaaaabaaaxbbaaabcdamno
Found    "xxx" at 3     xxxbaaaabaaaxbbaaabcdamno
Found    "ax" at 14     axbbaaabcdamno
Found    "axb" at 14    axbbaaabcdamno
Found    "xb" at 5      xbaaaabaaaxbbaaabcdamno
Found    "b" at 1       bcxxxbaaaabaaaxbbaaabcdamno
Found    "m" at 25      mno
Found    "mn" at 25     mno
Found    "mno" at 25    mno
Found    "no" at 26     no
Found    "o" at 27      o
Found    "" no result.
Found    "aaabaaaab" no result.
Found    "baaaabaaa" at 6       baaaabaaaxbbaaabcdamno
Found    "aabaaaxbbaaabcd" at 9         aabaaaxbbaaabcdamno
Found    "abcxxxbaaaabaaaxbbaaabcdamno" at 0    abcxxxbaaaabaaaxbbaaabcdamno

本文代码下载地址

http://download.csdn.net/detail/sun2043430/5273911

【模式匹配】之 —— Sunday算法相关推荐

  1. 【算法】Sunday算法(模式匹配)

    #背景 Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配.相对比较KMP和BM算法而言,简单了许多. #原理 平均性能的时间复杂度为O(n): 最差情况的时间复杂度为O ...

  2. 浅析 Sunday 算法

    背景 Sunday 算法是 Daniel M.Sunday 于 1990 年提出的字符串模式匹配. 其效率在匹配随机的字符串时比其他匹配算法还要更快.Sunday 算法的实现可比 KMP,BM 的实现 ...

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

    原文地址: https://www.cnblogs.com/Syhawk/p/4077295.html BF.KMP.BM.Sunday算法讲解 字串的定位操作通常称作串的模式匹配,是各种串处理系统中 ...

  4. Sunday算法java实现

    简介 Daniel M.Sunday于1990年提出的字符串模式匹配.其效率在匹配随机的字符串时比其他匹配算法还要更快,同时其实现方式比KMP,BM的实现容易太多. 算法原理 作为一个字符串模式匹配算 ...

  5. Java实现Sunday算法

    Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配.其核心思想是:在匹配过程中,模式串发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提高了匹配效率.相比于 ...

  6. Sunday 算法详解

    Sunday 算法 Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配.其核心思想是:在匹配过程中,模式串发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提 ...

  7. Sunday算法介绍及Java实现

    前言 最初想写这篇文章的原因是在LeetCode上看到了一道实现strStr函数的题: 实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haysta ...

  8. sunday算法特征码_sunday 算法

    sunday 算法 编辑 锁定 Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配.其核心思想是:在匹配过程中,模式串发现不匹配时,算法能跳过尽可能多的字符以进行下一步的 ...

  9. sunday算法c语言实现,C / C++学习笔记:实现Sunday算法

    Sunday算法 Sunday 算法于 1990 年 Daniel M.Sunday 提出的字符串模式匹配.其效率在匹配随机的字符串时比其他匹配算法还要更快.Sunday 算法的实现可比 KMP,BM ...

最新文章

  1. JScrollPane 双滚动条
  2. spring mvc + freemarker 整合
  3. 算法竞赛入门经典(第二版) | 例题4-2 刽子手游戏 (UVa489,Hangman Judge)
  4. 为什么1000 == 1000返回为False,而100 == 100会返回为True?
  5. Jetty架构解析及应用示例
  6. HTTP协议快速入门
  7. 如何解决python中编码错误的问题_【总结】Python 2.x中常见字符编码和解码方面的错误及其解决办法...
  8. linux下多线程之pthread_detach(pthread_self())
  9. 百度无人巴士阿波龙首次面向公众开放试乘
  10. 信息学奥赛一本通 1150:求正整数2和n之间的完全数
  11. Windows 2000安装和配置RIS服务
  12. 程序—java记事本
  13. linux 标准函数注释,Linux 驱动程序中相关函数注释汇总(跟新中)
  14. DensePose开源了,2D变3D人体姿势实时识别 | Facebook@CVPR 2018
  15. Android 实时数据库工具Database Inspector
  16. Datalogic得利捷携突破性无线充电技术推出三款最新产品
  17. 原创 | 罗勇:立足敏捷开放,推动直销银行向智能银行迈进
  18. 深度学习 (一)计算机如何处理和识别图片揭秘
  19. 数组、链表、LinkedList源码分析、跳表
  20. ACM入门及STL简介

热门文章

  1. Linux下C/C++实现以十六进制的形式显示命令(xxd)
  2. 利用matlab的interp1()对矩阵进行插值
  3. SAP 成本组件分割价格详解
  4. vue项目权限:数据权限、菜单权限、按钮权限
  5. google map for Android
  6. 解决Ubuntu16.04耳机没声音问题
  7. FS2222可调过压过流芯片IC,40V耐压过压保护可调OVP可调OCP
  8. oracle中sql查询
  9. ORB-Mono原理梳理
  10. ubuntu20.04关闭内核自动更新