我对实现Rabin-Karp算法以查找子字符串感到兴趣,如维基所述: http://en.wikipedia.org/wiki/Rabin-Karp_string_search_algorithm。这不是为了完成作业,而是出于个人兴趣。我已经实现了Rabin-Karp算法(如下所示),它可以正常工作。然而,性能真的很差!!!我知道我的哈希函数很基础。然而,似乎一个简单的strstr()调用总是比我的函数rabin_karp()表现更好。我可以理解原因 - 哈希函数每次循环要做更多的工作,而一次简单的按字符比较就行了。我错过了什么?Rabin-Karp算法应该比调用strstr()更快吗?在何时使用Rabin-Karp算法最佳?因此,产生了我的个人兴趣。我是否正确地实现了算法?
size_t hash(char* str, size_t i)
{
size_t h = 0;
size_t magic_exp = 1;
// if (str != NULL)
{
while (i-- != 0)
{
magic_exp *= 101;
h += magic_exp + *str;
++str;
}
}
return h;
}
char* rabin_karp(char* s, char* find)
{
char* p = NULL;
if (s != NULL && find != NULL)
{
size_t n = strlen(s);
size_t m = strlen(find);
if (n > m)
{
size_t hfind = hash(find, m);
char* end = s + (n - m + 1);
for (char* i = s; i < end; ++i)
{
size_t hs = hash(i, m);
if (hs == hfind)
{
if (strncmp(i, find, m) == 0)
{
p = i;
break;
}
}
}
}
}
return p;
}
rabin_karp
中的循环,然后重构hash
使其成为O(1)。 - Alexander