码迷,mamicode.com
首页 > 编程语言 > 详细

sunday算法简介

时间:2015-04-22 09:40:07      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:字符串匹配   算法   

概述

一说到字符串匹配算法,脑海里的第一映像,大部分是KMP算法,因为一般教科书里面都有,但是kmp算法对于我这种脑袋不怎么好用的,看完过一段时间就忘了。sunday同样是作为字符串匹配算法,比kmp,bm算法快,关键的关键是原理简单。

问题描述

先说说sunday算法解决的问题吧:给两个字符串A,B,问字符串A的所有子串中有没有B
具体的例子来说,给你一篇文章,判断该文章里面有没有“我爱我的家”这句话。

原理

最简单的办法肯定是蛮力匹配,从文章的开始位置,先看前5个字是不是“我爱我的家”,如果不是,向后移动一位,看第2到第6个字是不是“我爱我的家“,然后如此的进行下去。这样的方法肯定是能找出来的,但是效率就太低了。sunday算法的思想就是,当匹配不成功的时候,尽可能的跳过多的字符。
当匹配不成功的时候,我们就看子串结束位置的下一个字符,用C来表示,
情况一:如果C没有出现在B中,那我们下次比较的时候,就可以直接跳到C的下一个字符开始
情况二:如果C出现在B中,我们就用B的中最靠后C与之对其,所以在匹配之前,我们要对B先进行预处理,用来确定,当C为B中的某个字符的时候,所需要移动的步数

比如”我爱我的家”,我们预处理的结果为 (字符:步数){“我”:3,“爱”:4 ,“的”:2,”家”:1}
下面举一个具体的例子
A: 我 的 家 在 太 阳 , 太 阳 给 了 我 力 量,所 以 我 爱 我 的 家,我 爱 太 阳
B : - 我 爱 我 的 家
首先比较,是不成功,我们在看下一个字符C为 “阳”, 明显 “阳” 字不在B中,所以就是上面的情况一,然后我们再移动B字符,对其阳的下一个字符,“,”
A: 我 的 家 在 太 阳 , 太 阳 给 了 我 力 量,所 以 我 爱 我 的 家,我 爱 太 阳
B : ———————– 我 爱 我 的 家
也没有匹配成功,看下一个字符C为“我”,出现在B中,通过我们预处理的结果,出现“我”字移动3个位置,ok我们移动三个位置
A: 我 的 家 在 太 阳 , 太 阳 给 了 我 力 量 , 我 爱 我 的 家,我 爱 太 阳
B : —————————————- 我 爱 我 的 家
依然没有匹配成功,下一个字是“爱”, 出现在B中,预处理的结果告诉我们,移动4个位置
A: 我 的 家 在 太 阳 , 太 阳 给 了 我 力 量 ,我 爱 我 的 家,我 爱 太 阳
B : —————————————————— 我 爱 我 的 家
匹配成功

通过4次比较就找出来了,简单暴力吧

sunday算法简介

标签:字符串匹配   算法   

原文地址:http://blog.csdn.net/lizo_is_me/article/details/45177157

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!