同为字符串查找的算法, Sunday真的比KMP简单太多了。

理解也很简单:

下面的文字可能比较难理解, 可以参考这个博主的博客理解
[字符串匹配——Sunday算法]https://blog.csdn.net/q547550831/article/details/51860017
假设有 字符串 A, 待比较字符串 B, 需要查找 A是否包含B。

  1. 对齐A的i位置和B的0位置, i从0开始。

  2. 如果A[i] 元素和B[0]相同,就继续比较A的下一个元素和B的下一个值,比较len(B)次, 就是看A这段字符串是不是B, 如果是就退出结束了。当然事情可能没这么简单, 如果不是,我们就得把B往后移动, 对齐到A的后面位置去。暴力方法的话, 是B每次往后移动一个位置,跟A比较一次。 KMP/BM/Sunday 这些算法都是计算位移的, 即尽可能多的跳过无用的元素, 减少比较的次数。

  3. 如果在第二步从i到i+len(B)-1的比较过程中有一个位置不相同,就直接去看 A[i + len(B)]是否在B中。 如果不同, 说明什么? 此时,我们已知对齐到i位置时的A跟B不相同了, 这下好了,i+len(B)的位置也不同, 我们本来是应该接着从i+1位置对齐开始比较的, 这下没必要了。 因为假设B出现在A的i+1开始的位置,则A[i+len(B)]这个值一定会出现在B中(因为从A的i+1开始取的这段len(B)长的字符串肯定会越过A的i+len(B)的位置, i+1+len > i+len)。 然而, 我们已经知道A[i+len(B)]不在B中了, 所以反证A[i+1]到A[i+len(B)] 这一大块肯定都不包含B,都可以跳过去了。然后,又回到了步骤1。

  4. 当然, 上一步也可能A[i+len(B)] 就在B中, 假设出现在B的倒数第x个位置。 这说明可能从i+1开始, A的字符串就包含B了。 这里,我们也不用一步步往后移动了, 直接把A的i+len(B)位置跟B的 x位置对齐不就行了吗。 此时再判断A这段是否跟B相同。 这样其实又回到了步骤3、4, 循环往复。

  5. 退出条件是直到A中找到了B或者找到了最后也没找到, 最后这段只要比较到两个字符串尾巴对齐就可以了, 即len(A) - len(B)的位置。

def sunday_find(src, dst):len_src = len(src)len_dst = len(dst)i = 0while i < len_src - len_dst + 1:flag = 0shift = len_dstfor j in range(0, len_dst):if src[i+j] != dst[j]:flag = -1breakif flag == 0:return ip = dst.rfind(src[i+shift])if p == -1:shift = len_dst + 1else:shift = len_dst - pi = i + shiftreturn -1if __name__ == "__main__":text = "here_examplfe_v_example"pattern = "ple"pos = sunday_find(text, pattern)print pos

sunday 算法python实现相关推荐

  1. 字符串匹配的sunday算法

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

  2. LeetCode 字符串简单部分 算法 python实现

    ''' #2018-06-02 June Saturday the 22 week, the 153 day SZ LeetCode 字符串简单部分 算法 python实现 https://leetc ...

  3. 棋盘最短路径 python_Dijkstra 最短路径算法 Python 实现

    Dijkstra 最短路径算法 Python 实现 问题描述 使用 Dijkstra 算法求图中的任意顶点到其它顶点的最短路径(求出需要经过那些点以及最短距离). 以下图为例: 算法思想 可以使用二维 ...

  4. 2021-03-15 数据挖掘算法—K-Means算法 Python版本

    数据挖掘算法-K-Means算法 Python版本 简介 又叫K-均值算法,是非监督学习中的聚类算法. 基本思想 k-means算法比较简单.在k-means算法中,用cluster来表示簇:容易证明 ...

  5. 2021-01-28 粒子群优化算法-Python版本和Matlab函数 particleswarm 调用

    粒子群优化算法-Python版本和Matlab函数 particleswarm 调用 前两天分享了粒子群优化算法的原理和Matlab原理实现,本文分享一下Python代码下的PSO实现以及Matlab ...

  6. 最优化算法python实现篇(4)——无约束多维极值(梯度下降法)

    最优化算法python实现篇(4)--无约束多维极值(梯度下降法) 摘要 算法简介 注意事项 算法适用性 python实现 实例运行结果 算法过程可视化 摘要 本文介绍了多维无约束极值优化算法中的梯度 ...

  7. 最优化算法python实现篇(3)——无约束一维极值(黄金分割法)

    最优化算法python实现篇(3)--无约束一维极值(黄金分割法) 算法适用问题 python实现 示例运行结果 算法适用问题 搜索给定单峰区间的极值问题,一般对凸优化问题比较适用. python实现 ...

  8. 最优化算法python实现篇(2)—无约束一维极值(二分法)

    最优化算法python实现篇(2)--无约束一维极值(二分法) 算法适用问题 python实现 示例运行结果 算法适用问题 搜索给定单峰区间的极值问题,一般对凸优化问题比较适用. python实现 # ...

  9. 多元线性回归算法python实现_手写算法-Python代码推广多元线性回归

    1.梯度下降-矩阵形式 上篇文章介绍了一元线性回归,包括Python实现和sklearn实现的实例.对比,以及一些问题点,详情可以看这里: 链接: 手写算法-Python代码实现一元线性回归 里面封装 ...

最新文章

  1. 定期存款单的mysql编写程序_MySQL 调优和使用必读
  2. mac上安装dart环境
  3. 金九银十,做一个百度喜欢的淘宝客网站
  4. 一张图看懂数据库十年大格局!
  5. 6个超炫酷的HTML5电子书翻页动画【转】
  6. [mybatis]映射文件_参数处理_#和$取值区别
  7. c语言scanf附加格式*,C语言的scanf语句格式
  8. Entity Framework底层操作封装V2版本号(2)
  9. JS的Touch事件们
  10. laravel项目安装与重要目录文件说明(一)
  11. 十九、Oracle学习笔记:行变量
  12. 闲鱼双11端侧实践总结
  13. Mocking and Stubbing
  14. (Mix) The task phx.new could not be found
  15. 机器学习实战python版决策树以及Matplotlib注解绘制决策树
  16. 开源项目推荐:NS游戏模拟器Ryujinx
  17. 如何防止恶意攻击短信验证码接口
  18. 祝福老朋友今天的收获
  19. Redis入门指南之复制
  20. MySQL学习-修改表结构

热门文章

  1. kubeflow--安装使用pipeline
  2. C#输出Word文档
  3. html如何设置下拉列表
  4. 基于thinkphp5的开源cms
  5. Jetson学习笔记(一):jetson 系列镜像下载、烧写、设置散热风扇、中文包、pip、中转英目录、软件源、显示CSI摄像头
  6. 什么是Platform SDK?
  7. Python实战1-9例:变量、运算、字符串等综合训练
  8. 中国电子学会2022年06月份青少年软件编程Python等级考试试卷一级真题(含答案)
  9. QT多插件通信框架CTK编译记录
  10. iOS二维码生成与识别