字符串匹配之RK算法——学习笔记

RK算法是一种字符串匹配算法,介于一般算法和KMP、Sunday算法之间。它利用哈希函数思想,当两个字符串哈希值相同时可能存在匹配,不同则肯定不匹配。在最坏情况下,其复杂度较高。通过计算字符串子串的哈希值并与模式字符串对比,再进行字符校验。当哈希值过大时,可通过取模运算解决。算法包括计算模式和子串的哈希值,并更新子串哈希值的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RK算法是Rabin-Karp算法的简称,是经典的字符串匹配算法,在《算法导论》上是有介绍的,有兴趣的同学可以去看看。

RK算法的复杂度可以说是比上不足比下有余,比一般的匹配算法要好,但是又比不上KMP,Sunday等算法。算法表现跟快排比较相似,算法平均复杂度表现较好,但最坏情况时复杂度会相对较高。

 

RK算法的核心思想类似于hash函数。对于hash函数有了解的同学应该知道,我们通过hash函数可以将一个字符串映射成一个数字(hash值)。当两个字符串的hash值不相同时,说明这两个字符串一定不匹配,而相同时则说明两个字符串是有可能匹配的,那么就需要进一步验证。

 

首先给两个字符串,假设str长度为n,pattern长度为m:

char str[]={"abcdefgdcbaefg"};
char pattern[]={"gdcbae"};

我们利用下面的公式可以用pattern计算出一个值X:

d=26;
L=P.length;
X=P[L-1]+d*(P[L-2]+d*(P[L-3]+...+(P[1]+d*P[0])));

把pattern带入上面P中,可以求出一个值pattern_x,这个值就是代表pattern的hash值,或者说是映射值。d的取值根据字符串字符的所有可能性值的数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值