我有兴趣实现 Rabin-Karp 算法来搜索 wiki 上所述的子字符串: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;
}