Horspool算法(时空权衡)
利用空间提高时间效率
该算法是从模式串右往左方向匹配文本的,找不到匹配就右移模式串继续找。
文本串: s0 s1 …. A sn
B R O S E R (R与A不匹配)
s0 s1…. A R sn
B R O S E R(E与A不匹配)
此时,有不匹配位置pattern最后一个元素相对应的text元素来确定移动数组右移多少位置。(上面分别是A和R)
如上面两个例子移动为:
文本串: s0 s1 …. A sn
B R O S E R (模式串没有A)
s0 s1…. A R sn
B R O S E R(在还没匹配到的元素中,找到一个匹配的元素(R))
初始化移动数组是移动pattern的长度。
详细代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//计算辅助数组
void CreateTable(char pattern[], int length, int table[])
{
int idx;
for (idx = 0; idx < 26; ++idx)
table[idx] = length;
for (idx = 0; idx < length - 1; ++idx)
table[pattern[idx] - 97] = length - 1 - idx;
}
int Find_Pattern(char text[], int tlen, char pattern[], int plen)
{
if (tlen < plen)
return -1;
int table[26];
CreateTable(pattern, plen, table);
int idx = plen - 1;
int k;
while (idx <= tlen - 1)
{
k = 0;
while (text[idx - k] == pattern[plen - 1 - k]
&& k <= plen - 1)
++k;
if (k == plen)
return idx - plen + 1;
else
idx = idx + table[text[idx] - 97];
}
return -1;
}
int main(int argc, char *argv[])
{
while (1)
{
printf("Please input text:");
char text[256];
scanf("%s", text);
printf("Please input pattern:");
char pattern[256];
scanf("%s", pattern);
int idx = Find_Pattern(text, strlen(text), pattern, strlen(pattern));
printf("Result:\n");
printf("%s\n", text);
int i;
for (i = 0; i < idx; ++i)
printf("%c", 32);
printf("%s\n",pattern);
}
return 0;
}
horspool 最差效率为O(nm),随机文本来说是O(n)