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

匹配原理:
从前往后匹配:

  • 如果遇到不匹配情况判断母串 dest 参与匹配的最后一位的下一位字符,如果该字符出现在模板串 pattern 中,选择最右出现的位置进行对齐;
  • 否则直接跳过该匹配区域。

#分析
假设我们有如下字符串:

var dest = "This is a wonderful city";
var pattern = "wonder";

母串:
This is a wonderful city

模板串
wonder

开始匹配:
1、开始的时候,pos = 0:
i = 0 指向 dest 的第一个字符,j = 0 指向 pattern 的第一个字符,分别为"T"和"w",不相等;
Sunday算法要求,找到位于 dest 字串中位于 pattern 字符串后面的第一个字符,即下图中双向箭头所指向的字符" “(空格符),在模式字符串 pattern 中从后向前查找是否存在字符” “(空格符)。pattern 中不存在空格符,因此将 pos 指向 dest 中空格符所在的位置 7 。

2、此时,pos = 7:
i = 7 指向 dest 位置7处,j = 0 指向 pattern 的第一个字符,分别为” “(空格符)和"w”,不相等;
Sunday算法要求,找到位于 dest 字串中位于 pattern 字符串后面的第一个字符,即下图中双向箭头所指向的字符"d",在模式字符串 pattern 中从后向前查找是否存在字符"d"。模式串 pattern 中存在字符"d",因此将相等的字符对齐。pos 指向对齐时 pattern 的 0 位置处对齐母串 dest 的位置 10 。

3、此时,pos = 10:
i = 10 指向 dest 位置10处,j = 0 指向 pattern 的第一个字符,分别为"w"(空格符)和"w",相等。此时,循环排查是否一一对应,如果一一对应,则说明找到匹配处 pos ;若排查出现不相等,则从那个位置处继续分析。
#完整代码

/*** Sunday算法* @param dest 主串* @param pattern 模式串* @returns {number} 匹配位置处 或 -1(无匹配)*/
function sunday(dest, pattern) {var pos = 0,destLen = dest.length,patternLen = pattern.length;//使用hash方法:用字符编码作为下标保存字符所在位置,这样可以直接得到相匹配的最右边的位置。var next = [];for (var i = 0; i < 256; i++){next[i] = -1;}for (var i = 0; i < patternLen; i++){next[pattern[i].charCodeAt(0)] = i;}while (pos < destLen - patternLen + 1) {for (var i = pos, j = 0; j < patternLen && i < destLen && dest[i] == pattern[j]; i++, j++);if (j == patternLen)return pos;else {if (pos + patternLen < destLen)pos += (patternLen - next[dest[pos + patternLen].charCodeAt(0)]);elsereturn -1;}}return -1;
}

测试:

var dest = "This is a wonderful city";
var pattern = "wonder";
var pos = sunday(dest,pattern);  //pos = 10dest = "here is a example";
pattern = "example";
var pos = sunday(dest,pattern);  //pos = 10

【算法】Sunday算法(模式匹配)相关推荐

  1. 【算法】从后向前的字符串匹配算法——BMH算法+sunday算法

    前言 KMP算法将从前向后的字符串匹配的效率发挥到了极致,所以想要进一步提升,只能打破思维定式,找到一条与众不同的路.所以从后往前的字符串匹配算法就应运而生.它可以更为高效的快速移动字符串,但是在最坏 ...

  2. Sunday 算法详解

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

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

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

  4. 字符串匹配算法(Sunday算法)

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

  5. c语言指opt算法实现,Sunday算法c语言版实现

    一.BF算法 BF算法是普通的模式匹配算法,其基本思想就是将目标串的第一个字符与模式串的第一个字符进行匹配.若相等,则继续比较第二个字符:若不相等,则比较目标串的第二个字符和模式串的第一个字符.依次比 ...

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

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

  7. 深入理解Sunday算法(附上C++代码)

    2.Sunday算法 Sunday算法与KMP算法一样是从前往后匹配,在匹配失败时关注的是主串中参加匹配的最末位的下一位字符. 如果该字符没有在模式串中出现则直接跳过,即移动位数=模式串长度+1: 否 ...

  8. 【模式匹配】之 —— Sunday算法

    本文代码下载地址 http://download.csdn.net/detail/sun2043430/5273911 Sunday算法思路 Sunday算法的思想和BM算法中的坏字符思想非常类似. ...

  9. 浅析 Sunday 算法

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

最新文章

  1. Haproxy Nginx cluster构建
  2. RDKit | 基于机器学习的化合物活性预测模型
  3. vector 指针 的指针
  4. Latex、Lyx学习备忘
  5. python批量处理csv_Python批量处理csv并保存过程代码解析
  6. csmar eco research
  7. handler和thread之间如何传输数据_使用Mac OS X如何开启和配置防火墙
  8. 具有InlfuxDB的Spring Boot和Micrometer第3部分:Servlet和JDBC
  9. python基础:迭代器、生成器(yield)详细解读
  10. MPEG-2TS码流编辑的原理及其应用(转载
  11. [NOI2019]回家路线
  12. Java删除指定值结点[递归]图解
  13. 免费snmp oid下载
  14. Win10 安装 VS2015 失败解决办法
  15. 一牛人总结的开发流程工具组合
  16. 全国各地区域码 --- (当地身份证号前六位)
  17. Genero Studio导入ds.sch失败处理办法_Error importing schema file:Check Ouput view for datails. mod-db3[11003]
  18. 辛苦编码好几年,一朝栽在算法前
  19. Unity 材质设置为tiling不能够重复的问题
  20. 如何升级pycharm 中pip的版本

热门文章

  1. shiro的基本认识
  2. Solidity基础入门讲解
  3. const和extern用法
  4. 备份iphoneXR手机照片
  5. Echarts去除x轴,y轴网格线,网格区域(背景)
  6. 霍尔传感器的工作原理
  7. 【开发工具】Office Tool Plus 安装 Office
  8. 卷积神经网络 (CNN) 基本原理和公式
  9. android google map v2 获取当前位置,如何在google map v2中获取当前位置信息?
  10. KubeCon + CloudNativeCon + Open Source Summit 2019大会上海开幕看点不断!