质数的大小如何影响 Rabin Karp 的运行时间?
How does the size of the prime number affect Rabin Karp’s runtime?
根据我的理解,用于模数的 P 素数的大小应为 32 位,以便可以在 O(1) 中比较最终的哈希键。如果我们决定使用一个大于 m(模式大小)的素数,那会不会使我们恢复到原始的 运行 O(mn) 时间,因为我们要在 O(m) 中比较 n-m 次迭代?
把事情发挥到极致可能会有所帮助。
假设您的素数 P 是可能的最小素数 2。那么只有两个可能的哈希码可以在滚动哈希中计算,因此您希望在大约 50% 的索引处看到匹配的哈希在字符串中。如果模式从不存在,那么平均运行时间将达到 Θ(mn)。
另一方面,想象一下选择一个无论出于何种意图和目的都是无限的素数 P(例如,一个素数超过 2300 位)。这意味着 P 的修改本质上是 no-op,因为滚动哈希永远不会超过 P。在这种情况下,滚动哈希中的位数将与模式的长度大致相当,因此,对于平均 Ω(mn) 的净运行时间,每一步更新滚动哈希的工作量为 Ω(m)。
根据我的理解,用于模数的 P 素数的大小应为 32 位,以便可以在 O(1) 中比较最终的哈希键。如果我们决定使用一个大于 m(模式大小)的素数,那会不会使我们恢复到原始的 运行 O(mn) 时间,因为我们要在 O(m) 中比较 n-m 次迭代?
把事情发挥到极致可能会有所帮助。
假设您的素数 P 是可能的最小素数 2。那么只有两个可能的哈希码可以在滚动哈希中计算,因此您希望在大约 50% 的索引处看到匹配的哈希在字符串中。如果模式从不存在,那么平均运行时间将达到 Θ(mn)。
另一方面,想象一下选择一个无论出于何种意图和目的都是无限的素数 P(例如,一个素数超过 2300 位)。这意味着 P 的修改本质上是 no-op,因为滚动哈希永远不会超过 P。在这种情况下,滚动哈希中的位数将与模式的长度大致相当,因此,对于平均 Ω(mn) 的净运行时间,每一步更新滚动哈希的工作量为 Ω(m)。