Horspool字符串匹配算法
来源:互联网 发布:刷单软件 编辑:程序博客网 时间:2024/06/06 06:39
Horspool是后缀搜索,也就是搜索已读入文本中是否含有模式串的后缀;如果有,是多长,显然,当后缀长度等于模式串的长度时,我们就找到了一个匹配。
Horspool算法认为:对于每个文本搜索窗口,将窗口内的最后一个字符(C)与模式串的最后一个字符进行比较。如果相等,则继续从后向前验证其他字符,直到完全相等或者某个字符不匹配。然后,无论匹配与否,都将根据在模式串的下一个出现位置将窗口向右移动。
匹配串:abcbcsdxzcxx
模式串:cbcac
这个时候我们从右向左进行对暗号,c-c,恩对上了,第二个b-a,不对啊,我们应该怎么办?难道就这么放弃么。于是,模式串从不匹配的那个字符开始从右向左寻找匹配串中不匹配的字符b的位置,结果发现居然有,赶快对上赶快对上,别耽误了。
匹配串:abcbcsdxzcxx
模式串: cbcac
然后继续从最右边的字符从右向左进行比较。这时候,我们发现了,d-c不匹配啊,而且模式穿里面没有噢,没办法,只好移动一个模式串长度的单位了。
匹配串:abcbcsdxzcxx
模式串: cbcac
判断模式串是否出现在源串的i位时,从i+m-1位开始比较,当比较到不同的时候。根据i+m-1位的内容对i作跳转。
如果i+m-1位的字符不在模式串中出现,则i+=m,
(这是因为i+m-1不在模式串里出现,则从i,i+1,i+m-1开始的串,都不可能完全匹配。)
否则寻找该字符在模式串中最后一次出现的位置,
如果最后一次是出现在最后一位,
则找再上一次的出现,如果找不到,则i+=m,
i += m-最后一次出现的位置
(原因是,完全匹配的时候,至少i+m-1是匹配的,所以这个移动是找最后的一个位置,使得i+m-1位匹配)
Horspool算法认为:对于每个文本搜索窗口,将窗口内的最后一个字符(C)与模式串的最后一个字符进行比较。如果相等,则继续从后向前验证其他字符,直到完全相等或者某个字符不匹配。然后,无论匹配与否,都将根据在模式串的下一个出现位置将窗口向右移动。
匹配串:abcbcsdxzcxx
模式串:cbcac
这个时候我们从右向左进行对暗号,c-c,恩对上了,第二个b-a,不对啊,我们应该怎么办?难道就这么放弃么。于是,模式串从不匹配的那个字符开始从右向左寻找匹配串中不匹配的字符b的位置,结果发现居然有,赶快对上赶快对上,别耽误了。
匹配串:abcbcsdxzcxx
模式串: cbcac
然后继续从最右边的字符从右向左进行比较。这时候,我们发现了,d-c不匹配啊,而且模式穿里面没有噢,没办法,只好移动一个模式串长度的单位了。
匹配串:abcbcsdxzcxx
模式串: cbcac
判断模式串是否出现在源串的i位时,从i+m-1位开始比较,当比较到不同的时候。根据i+m-1位的内容对i作跳转。
如果i+m-1位的字符不在模式串中出现,则i+=m,
(这是因为i+m-1不在模式串里出现,则从i,i+1,i+m-1开始的串,都不可能完全匹配。)
否则寻找该字符在模式串中最后一次出现的位置,
如果最后一次是出现在最后一位,
则找再上一次的出现,如果找不到,则i+=m,
i += m-最后一次出现的位置
(原因是,完全匹配的时候,至少i+m-1是匹配的,所以这个移动是找最后的一个位置,使得i+m-1位匹配)
真正编程的时候,不用写这么多分支处理,直接在预处理的时候,用一个数组表示i每次要加上的数就行了。(对数组的理解,映射表)
int HorspoolMatch(byte* pSrc, int nSrcSize, byte* pSubSrc, int nSubSrcSize){ if (nSubSrcSize > nSrcSize) { return -1; } short skip[256]; for(int i = 0; i < 256; i++) { skip[i] = nSubSrcSize; } for(int i = 0; i < nSubSrcSize - 1; i++) { skip[pSubSrc[i]] = nSubSrcSize - i - 1; } int pos = 0; while(pos <= nSrcSize - nSubSrcSize) { int j = nSubSrcSize -1; while(j >= 0 && pSrc[pos + j] == pSubSrc[j]) { j--; } if(j < 0 ) { break; } pos = pos + skip[pSrc[pos + nSubSrcSize -1]]; } return pos;}
- Horspool字符串匹配算法
- Horspool字符串匹配算法
- Horspool字符串匹配算法
- HorsPool字符串匹配算法
- 字符串匹配算法horspool
- Horspool(字符串匹配)算法
- 字符串匹配之Horspool算法
- 字符串匹配之horspool算法
- 字符串匹配算法 之 (Horspool )Boyer-Moore-Horspool
- 【算法学习】horspool查找匹配字符串
- 字符串匹配 — Horspool
- 快速字符串模糊匹配--基于Horspool的模糊匹配算法
- 字符串匹配之horspool算法(简化的BM算法)
- sunday、kmp、 bm、 horspool字符串匹配算法 code
- 字符串匹配---KMP,Horspool,Boyer-Moore和Sunday等算法
- 字符串模式匹配之Brute force、KMP、Horspool算法
- 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽
- 算法设计与分析基础-7.2、字符串匹配中的输入增强技术,Horspool算法
- android获取web服务器端session并验证登陆
- C++ 模版与线程安全锁的应用
- erlang进程性能分析方法
- Cocos2d-x开发环境配置
- 题目1449:确定比赛名次
- Horspool字符串匹配算法
- 跟着BOY学习开发cocos2d-x 游戏 (前提篇 一)
- Fedora19安装和共存
- iOS应用程序状态切换相关
- 判断CPU的大小端
- 常用linux命令
- Android_04
- URI和URL
- jsoncpp vs2010 导入静态库 错误