BM法
Posted: 2007年11月08日(木) 01:16
#include <stdio.h> #include <string.h> #define NOMATCH -1 void makenext(unsigned char *p, int *next); int bm(char *p, char *t); int main() { char text[/url] = "ABCXDEZCABACABAC"; char pattern[/url] = "ABAC"; int result; result = bm(pattern, text); if(-1 == result) printf("NOMATCH\n"); else printf("MATCH, MATCHING POINT FROM %d\n", result + 1); return 0; } int bm(char *p, char *t) { int plen = strlen(p); int tlen = strlen(t); int next[256]; int i = 0, j = 0; makenext(p, next); i = plen - 1; while(i < tlen) { j = plen - 1; while(t == p[j]) { printf("\nwhile: t[%d] = %c, p[%d] = %c\n", i, t, j, p[j]); printf(" plen - j = %d\n", plen - j); printf(" plen = %d\n", plen); printf(" j = %d\n", j); printf(" i = %d\n", i); printf(" next = %d\n", next); printf(" next[ t ] = %d\n\n", next[ t ]); if(j == 0) return i; --i; --j; } if(next > plen - j) { printf("\nif: t[%d] = %c, p[%d] = %c\n", i, t, j, p[j]); printf(" plen - j = %d\n", plen - j); printf(" plen = %d\n", plen); printf(" j = %d\n", j); printf(" i = %d\n", i); printf(" next = %d\n", next); printf(" next[ t[i] ] = %d\n\n", next[ t[i] ]); i += next[ t[i] ]; } else { printf("\nelse : t[%d] = %c, p[%d] = %c\n", i, t[i], j, p[j]); printf(" plen - j = %d\n", plen - j); printf(" plen = %d\n", plen); printf(" j = %d\n", j); printf(" i = %d\n", i); printf(" next[i] = %d\n", next[i]); printf(" next[ t[i] ] = %d\n\n", next[ t[i] ]); i += plen - j; } } return NOMATCH; } void makenext(unsigned char *p, int *next) { int n, k; n = strlen(p); for(k = 0; k < 256; k++) { next[k] = n; } for(k = 0; k < n - 1; k++) { next[ p[k] ] = n - k - 1; } return; }
上記のプログラムでif(next[i] > plen - j)のplen - j は何を表しているのでしょうか?
また, このプログラムでtextとpatternを色々いじっているときに無限ループに入ってしまいました. このときのtextとpatternをメモしとけばよかったのですが・・・・確かちょうど, 上記のif文で next['A'(65)]あたりからおかしくなっていました. next['A'(65)]の値がそのpattern の長さではなかったです.
ご協力ねがいます. このソースで2日なやんでていいかげん寝たいです^^;