- Z-BOX算法
- KMP算法
- BM算法
- sunday算法
一 Z-BOX的概念
i | Zi(p)值 | 說明 |
0 | 略過 | |
1 | 1 | p[1] = p[0] |
2 | 0 | p[2] != p[0] |
3 | 2 | p[3, 4] = p[0, 1] |
4 | 3 | p[4,5,6] = p[0,1,2] |
5 | 1 | p[5] = p[0] |
6 | 0 | p[6] != p[0] |
7 | 0 | p[7] != p[0] |
二 Z-BOX算法的計算過程
三 Z-BOX算法的代碼實現(C語言版)
#include <string.h>
#include <stdio.h>
void ZBox(const char* pattern, unsigned int length, unsigned int zbox[])
{
zbox[0] = 0;
unsigned int left = 0;
unsigned int right = 0;
for (unsigned int i = 1; i < length; i++)
{
if (i > right)//情況3
{
int n = 0;
for ( ; pattern[n] == pattern[i+n]; n++);
if (0 != n)
{
right = i+n-1;
left = i;
}
zbox[i] = n;
}
else
{
if (zbox[i-left] < right-i+1)//情況1
{
zbox[i] = zbox[i-left];
}
else//情況2
{
int n = 1;
for (;pattern[right-i+n] == pattern[right+n]; n++);
zbox[i] = right-i+n;
right += n-1;
left = i;
}
}
printf(" zbox[%d] = %d, left is %d, right is %d\r\n", i, zbox[i], left, right);
}
}
int main(int argc, char* argv[])
{
const char pattern[] = "aabaaab";
unsigned int zbox[100];
ZBox(pattern, strlen(pattern), zbox);
return 0;
}
上面的程序輸出結果爲:
zbox[2] = 0, left is 1, right is 1
zbox[3] = 2, left is 3, right is 4
zbox[4] = 3, left is 4, right is 6
zbox[5] = 1, left is 4, right is 6
zbox[6] = 0, left is 4, right is 6
四 Z-BOX算法在具體的模式匹配、字符串查找中的應用
#include <string.h>
#include <stdio.h>
int SearchWithZBox(const char* dest, const char* pattern)
{
int nDlen = strlen(dest);
int nPlen = strlen(pattern);
char *str = new char[nDlen+nPlen];
if (!str)
{
goto Exit0;
}
int *Z = new int[nDlen+nPlen];
if (!Z)
{
goto Exit0;
}
memcpy(str, pattern, nPlen);
memcpy(str+nPlen, dest, nDlen);
//create z box
Z[0] = 0;
int l = 0;
int r = 0;
for (int i = 1; i < nDlen+nPlen; i++)
{
if (i > r)
{
int n = 0;
for (; str[i+n] == str[n]; n++);
if (n > 0)
{
l = i;
r = i+n-1;
}
Z[i] = n;
}
else
{
if (Z[i-l] < r-i+1)
{
Z[i] = Z[i-l];
}
else
{
int n = 1;
for (int s = r-i; str[s+n] == str[r+n]; n++);
Z[i] = r-i+n;
l = i;
r = r+n-1;
}
}
if (i >= nPlen && Z[i] >= nPlen)
{
printf("Search With ZBox Find at %d\r\n", i - nPlen);
}
}
Exit0:
if (str)
{
delete str;
str = NULL;
}
if (Z)
{
delete Z;
Z = NULL;
}
return -1;
}
int main(int argc, char* argv[])
{
// 0 1 2 3 4 5
// 012345678901234567890123456789012345678901234567890123456789
const char dest[] = "demoxdemoaaabaaaxdembbaaaddemobaaababdemoooabcxbaabaaadddemo";
const char pattern[] = "aabaaab";
unsigned int zbox[100];
//ZBox(pattern, strlen(pattern), zbox);
SearchWithZBox(dest, "demo");
return 0;
}
Search With ZBox Find at 5
Search With ZBox Find at 26
Search With ZBox Find at 37
Search With ZBox Find at 56
五 總結
六 參考資料
轉載至:http://blog.csdn.net/sunnianzhong/article/details/8784853
這是一本全面介紹字符串處理算法的書籍,我沒有找到中文版,這是英文版