【算法学习】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)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值