左岸阳光

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

12 2012 档案

摘要:先来规定一些符号,S表示一个字符串,|S|表示字符串的长度,没有特殊说明n表示匹配串的长度,m表示模式串的长度。prefix(i)表示S的后缀S[i...n]。 zbox算法只是对一个字符串S求出一个数组Zbox[]。Zbox[i]表示的是prefix[i]和字符串S的最长公共前缀的长度。即zbox算法的目的是初始化所有字符串后缀对与原串的最长公共前缀长度。 先来看看通过Zbox[]数组如何进行精确匹配。匹配串记为S,模式串记为P。要用一个数组把S和P关联起来,一个常用的方法是把S和P连接。这里把P放在前面得到新串T = P+S。现在对新串进行zbox的过程求出Zbox[]。根据定义可... 阅读全文
posted @ 2012-12-31 18:36 左岸阳光 阅读(386) 评论(0) 推荐(0)

摘要:这个算法利用了位运算的优势速度很快,易于实现,缺点是模式串不能太长。据说在适用范围内速度是kmp的至少2倍。算法思想是用一个数字prefix的二进制去表示模式串的前缀,prefix的二进制第i位表示模式串的前缀0~i。如果这个前缀i是当前搜索到的匹配串的后缀时,将第i位至1。算法就是从匹配串的第0个字符到最后一个字符不断更新prefix的值每次更新后看最长的前缀(即模式串)的位是否被至1,如果是说明得到了一个匹配。 下面说明下更新的过程。假如求出了比较匹配串第j位时的prefix,现在求比较j+1位的情况:prefix第i位为1当且仅当prefix第i-1位为1(匹配了i-1个字符),并... 阅读全文
posted @ 2012-12-30 00:24 左岸阳光 阅读(1035) 评论(0) 推荐(0)

摘要:kmp被分类成基于前缀搜索的匹配算法,把模式串(要寻找的串)当作一个滑动窗口在匹配串上滑动,匹配顺序是从左到右。不论是基于前缀搜索,基于后 缀搜索,还是子串搜索,每次失配向后移动多个字符好像是这些单串匹配算法的共同特点。kmp的思想是每次失配或者匹配成功进行下一次匹配的时候,不像暴力 那样只移动一个字符之后重模式串头部匹配,而是每次最优的向后移动多个字符并且之后可以从失配的地方开始匹配。 为了实现这个,kmp初始化了每个模式串前 缀的最大边界,即代码中的nextjmp[],存的是边界作为模式串前缀的末尾下标。所谓字符窜的边界,是指既是字符窜的前缀又是字符窜的后缀的真子串 (不能是本身,否... 阅读全文
posted @ 2012-12-29 22:42 左岸阳光 阅读(441) 评论(0) 推荐(0)