【算法学习】horspool查找匹配字符串

来源:互联网 发布:网络营销策划书 编辑:程序博客网 时间:2024/06/05 09:42

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)


0 0