搜索文本 text = "my testing algorithm in test"

模式 pattern = "test"

Sunday算法的关键点在于

1.设定一个匹配位移映射 shift[],这个shift[]映射关系必须按从左到右的顺序简历,例如pattern = "test",注意到此处有2个t,那么建立出来的位移映射是 shift[] = Array ( [t] => 1 [e] => 3 [s] => 2 ),而如果不是从左到右,是从右到左的建立映射,就会变成 shift[] = Array ( [t] => 4 [e] => 3 [s] => 2),这样到时候匹配就无法得到正确结果

2.根据当前比对字符串的下一个字符来确定位移长度,如下图

第一次比较的时候,如图1,第一个字符“m”就和“t”不一样,那就查找比patter长1位的text中的字符,为“e”,然后查找映射表,e => 3,接下来把pattern向后移动3位,就到了,图2中的位置,再从“t”开始比较,发现匹配到了继续往后,看text中比pattern长1的那个字符,为“i”,此时发现映射表中没有“i”,则直接将pattern向后移动pattern_size位,就到了图3,然后重复前面的过程,直到比较到text_size - patter_size为坐标的那个字符

下面是代码:

 1 <?php
 2     #字符串匹配,sunday算法
 3
 4     function sunday($patt, $text) {
 5         $patt_size = strlen($patt);
 6         $text_size = strlen($text);
 7
 8         #初始化字符串位移映射关系
 9         #此处注意,映射关系表的建立一定是从左到右,因为patten可能存在相同的字符
10         #对于重复字符的位移长度,我们只能让最后一个重复字符的位移长度覆盖前面的位移长度
11         #例如pattern = "testing",注意到此处有2个t,那么建立出来的位移映射是 shift[] = Array ( [t] => 4 [e] => 6 [s] => 5 [i] => 3 [n] => 2 [g] => 1 )
12         #而如果不是从左到右,是从右到左的建立映射,就会变成 shift[] = Array ( [t] => 7 [e] => 6 [s] => 5 [i] => 3 [n] => 2 [g] => 1 ),这样到时候匹配就无法得到正确结果
13         for ($i = 0; $i < $patt_size; $i++) {
14             $shift[$patt[$i]] = $patt_size - $i;
15         }
16
17         $i = 0;
18         $limit = $text_size - $patt_size; #需要开始匹配的最后一个字符坐标
19         while ($i <= $limit) {
20             $match_size = 0; #当前已匹配到的字符个数
21             #从i开始匹配字符串
22             while ($text[$i + $match_size] == $patt[$match_size]) {
23                 $match_size++;
24                 if ($match_size == $patt_size) {
25                     echo "Match index: {$i} <br>";
26                     break;
27                 }
28             }
29
30             $shift_index = $i + $patt_size; #在text中比pattern的多一位的字符坐标
31             if ($shift_index < $text_size && isset($shift[$text[$shift_index]])) {
32                 $i += $shift[$text[$shift_index]];
33             } else {
34                 #如果映射表中没有这个字符的位移量,直接向后移动patt_size个单位
35                 $i += $patt_size;
36             }
37         }
38     }
39
40     $text = "my testing algorithm test";
41     $patt = "test";
42
43     sunday($patt, $text);
44 ?>

Match index: 3 
Match index: 21

转载于:https://www.cnblogs.com/zemliu/archive/2012/09/29/2708894.html

PHP 字符串匹配算法 Sunday算法相关推荐

  1. c++ 字符串匹配算法sunday算法

    sunday 算法是一种很高效的字符串匹配算法, 其实现也较kmp算法简单很多 class Sunday {public:const string& needle;int mp[300];Su ...

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

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

  3. 字符串匹配算法——暴力算法

    字符串匹配算法--暴力算法,简称BF(BruteForce)BF(Brute\:Force)BF(BruteForce)算法. 基本思想:从主串(str)(str)(str)的第一个字符开始和子串(p ...

  4. 【GO语言实现字符串匹配算法-KMP算法】

    [GO语言实现字符串匹配算法-KMP算法] KMP算法原理说明: KMP算法是一种改进的字符串匹配算法,是有D.E.Knuth,J.H.Morris和V.R.Pratt提出的,所以被称为KMP算法. ...

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

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

  6. 字符串匹配算法KMP算法

    数据结构中讲到关于字符串匹配算法时,提到朴素匹配算法,和KMP匹配算法. 朴素匹配算法就是简单的一个一个匹配字符,如果遇到不匹配字符那么就在源字符串中迭代下一个位置一个一个的匹配,这样计算起来会有很多 ...

  7. js实现kmp算法_字符串匹配算法KMP算法

    数据结构中讲到关于字符串匹配算法时,提到朴素匹配算法,和KMP匹配算法. 朴素匹配算法就是简单的一个一个匹配字符,如果遇到不匹配字符那么就在源字符串中迭代下一个位置一个一个的匹配,这样计算起来会有很多 ...

  8. 字符串匹配算法——KMP算法学习

    KMP算法是用来解决字符串的匹配问题的,即在字符串S中寻找字符串P.形式定义:假设存在长度为n的字符数组S[0...n-1],长度为m的字符数组P[0...m-1],是否存在i,使得SiSi+1... ...

  9. c++ 字符串匹配算法Robin-Karp算法

    在看 indexRabinKarp 函数之前,我们先了解一下 RabinKarp 算法. RobinKarp算法是由 Robin 和 Karp 提出的字符串匹配算法.该算法在实际应用中有较好的表现. ...

最新文章

  1. Kotlin实战指南一:集合
  2. 十大排序算法之插入排序
  3. 【转】BPM与ERP,OA系统的区别和关系
  4. PHP 函数截图 哈哈哈
  5. 【python asyncio 运行报错】:raise RuntimeError(‘There is no current event loop in thread %r‘)
  6. matlab中response函数,matlab函数的种类
  7. 面向对象:三大特性与五大原则
  8. javaWeb上传文件(jsp上传文件)
  9. python-set
  10. dvwa上传php文件,DVWA之文件上传漏洞
  11. attr()和prop()的区别
  12. DataCastle用户贷款风险预测(完整数据)
  13. JAVA语言编程练习--图形界面+文件输入输出流--实现简单的用户注册登录系统
  14. Oracle前台主机,Oracle 数据库主机巡检
  15. IIS配置好后,出现路径的情况。
  16. 戏曲app开发,展现戏曲行业发展新生机
  17. 软件开发规范和标准_【软件】ISO26262标准软件功能安全要求
  18. oracle不等于怎么走索引,oracle为什么不走索引
  19. 图解HTTP 第二,三章学习总结
  20. Python解析word接口文档生成java bean

热门文章

  1. 最大子数组累加和(2种方法)
  2. bzoj 1645: [Usaco2007 Open]City Horizon 城市地平线(线段树扫描线)
  3. 官网opencv练习题 最简单的多物体分离技术
  4. html表格宽度拖拽,原生js实现 拖拽改变 table表格列宽
  5. Nginx+php+mysql+wordpress搭建自己的博客站点
  6. Django 系列博客(十一)
  7. 学习python 基础密码验证
  8. [DB]MariaDB 与 MySql 数据库
  9. linux 服务器网络有关的内核参数
  10. 操作系统和语言的关系(转载)