Rabin-Karp算法:字符串匹配问题

为什么写这篇博客

其实有不少博客都有写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呢?如果通过一个哈希函数

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值