ウィキに記載されているように、サブ文字列を検索するためのラビン-カープアルゴリズムの実装に興味があります:http://en.wikipedia.org/wiki/Rabin-Karp_string_search_algorithm。宿題のためではなく、利己心のためです。Rabin-Karpアルゴリズム(以下に表示)を実装しましたが、機能します。しかし、パフォーマンスは本当に、本当に悪いです!!! 私のハッシュ関数は基本的なものだと理解しています。ただし、strstr()を呼び出すだけで、関数rabin_karp()よりも常にパフォーマンスが向上するようです。理由は理解できます。ハッシュ関数は、各ループを単純な文字ごとに比較するよりも多くの作業を行っています。ここで何が欠けていますか?Rabin-Karpアルゴリズムは、strstr()の呼び出しよりも高速である必要がありますか?ラビン-カープアルゴリズムが最適に使用されるのはいつですか?したがって、私の利己心。アルゴリズムを正しく実装しましたか?
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;
}