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

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)

    原文作者:查找算法
    原文地址: https://blog.csdn.net/Jammg/article/details/51694589
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞