【发布时间】:2021-07-03 09:49:23
【问题描述】:
我需要一些关于我的 Karp-Rabin 算法的特定部分的帮助。
我要做的是使用固定的sliding window 和单独的append 和skip 部分来实现版本。 Sliding window 工作得很好。当我尝试将单体 sliding window 拆分为 append 和 skip 部分时,就会出现问题。 Append 似乎工作正常,但 skip 是最近几天让我头疼的东西。
问题 - 我正在滑过包含几个订阅模式实例的字符串。 Sliding window 检测到它,但没有检测到其他两个。
这个想法是 RH 结构保存 (base ^ window size) mod prime number (b2wmod) 的预计算值,因此我可以删除字符串的前导字符.在所有append 和skip 之后,此值会随着窗口大小的变化而变化。为了减少b2wmod 的值,乘法逆用于不处于模删除的情况(基本模模值的逆)。它也是预先计算的。
以下是我感兴趣的代码部分。我不发布整个代码以免您阅读所有内容,但如果需要可以上传。乘法逆似乎计算正确,但我也可以上传代码。
不胜感激!提前谢谢!
void
append_to_rh(RH rh)
{
uint64_t hash = rh->hash;
uint64_t base = rh->base;
uint64_t mod = rh->mod;
uint64_t b2wmodm = rh->b2wmodm;
char new = rh->new;
hash = ( hash * base + new ) % mod;
b2wmodm = ( b2wmodm * base ) % mod;
rh->hash = hash;
rh->b2wmodm = b2wmodm;
}
void
skip(RH rh)
{
uint64_t hash = rh->hash;
uint64_t base = rh->base;
uint64_t mod = rh->mod;
uint64_t b2wmodm = rh->b2wmodm;
uint64_t m_inv = rh->m_inv;
char old = rh->old;
uint64_t correction = old * mod;
b2wmodm = ( b2wmodm * (m_inv % mod) ) % mod;
hash = ( hash - old * b2wmodm + correction ) % mod;
rh->hash = hash;
rh->b2wmodm = b2wmodm;
}
void
slide_window(RH rh)
{
uint64_t base = rh->base;
uint64_t mod = rh->mod;
uint64_t hash = rh->hash;
uint64_t b2wmodm = rh->b2wmodm;
char old = rh->old;
char new = rh->new;
hash = ( hash * base - old * b2wmodm + new ) % mod;
rh->hash = hash;
}
【问题讨论】:
标签: c algorithm rabin-karp