为什么写这篇博客
其实有不少博客都有写Rabin-Karp算法,而且这个算法也非常简单易懂,但是很多人都说“该算法的理论复杂度是O(mn),在实际生活中是O(m+n)”。
其实这个是不对的,在理论上,这个算法的复杂度也是O(m+n)。这篇文章就是想更深的一步讨论Rabin-Karp算法,解释为什么它的复杂度就应该是O(m+n)。
SubString Pattern Matching(字符串匹配/查重)
Rabin-Karp是用来解决字符串匹配(查重)的问题的。该问题的严谨定义如下:
Input:一段字符串t,和一个字符串p
Output:如果t中含有p,那么输出yes,如果没有,输出no
用大白话说,就是看p是不是t的子字符串,如果是的话,输出yes,如果不是的话,输出no
如何hashing字符串
比较笼统和宽泛的来说,哈希其实就是把一个定义域较宽的集合映射到一个值域较小的集合。一般来说,我们映射的结果是一个整数,也就是俗称的地址。比如说现在有一个数为x,我们希望进行哈希运算之后的H(x)是一个整数,然后我们把x放到哈希表中地址为H(x)的地方。
如果x是一个数字,这个理解起来比较直观,我们可以定义哈希函数为对这个数字的四则运算,得到一个新的数字,作为x的哈希值。
那么如果x是一个字符串S呢?如果通过一个哈希函数