利用空间提高时间效率
该算法是从模式串右往左方向匹配文本的,找不到匹配就右移模式串继续找。
文本串: 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)