首页 > 编程语言 >Rabin Karp 算法

Rabin Karp 算法

时间:2024-06-23 20:58:56浏览次数:3  
标签:子串 Karp hash 算法 哈希 Rabin

Rabin Karp 算法

Rabin Karp 算法,简称 RK 算法,是由 Michael Oser Rabin 和 Richard Manning Karp 在1987 年提出的字符串搜索算法。该算法主要用于在文本中搜索单个模式串的位置,其基于哈希函数的原理,将字符串和模式都映射为一个整数值,并通过比较这些整数值来确定它们是否匹配。

基本思想

哈希函数的使用:Rabin Karp 算法将字符串和模式都视为数字(例如,将它们看作字符编码的值),然后使用哈希函数来计算它们的哈希值。
滚动哈希算法:在 RK 算法中,一个重要的步骤是滚动哈希算法,它允许我们快速计算文本串中每个子串的哈希值,而不需要重新计算整个子串的哈希值。这大大提高了算法的效率。
算法步骤

  1. 预处理: 计算模式串 p 的哈希值 hash_p。 计算文本串 T 中每个长度为 m(模式串长度)的子串的哈希值,并将它们与hash_p 进行比较。
  2. 匹配过程: 对于文本串 T 中的每个子串,如果其哈希值与 hash_p相等,则进一步检查子串和模式串是否完全匹配(以避免哈希冲突)。 如果哈希值不同,则直接跳过该子串,继续向后匹配。如果找到匹配的子串,则返回其起始位置。 如果遍历完整个文本串仍未找到匹配项,则返回 -1。

滚动哈希算法

在 Rabin-Karp(RK)算法中,滚动哈希(Rolling Hash)是一个重要的概念,用于高效地计算字符串的哈希值,特别是在处理字符串的子串匹配问题时。滚动哈希允许我们在 O(1) 时间复杂度内将哈希值从一个子串更新到其相邻的子串,这使得 RK 算法在处理文本搜索时非常高效。
下面我们用一个例子来解释一下这种算法思想。
在这里插入图片描述

PYTHON代码实现说明

def rabinKarp(T: str, p: str, d: int, q: int) -> int:
    n, m = len(T), len(p)
    if n < m:
        return -1  # 如果文本串长度小于模式串长度,直接返回-1
    hash_p, hash_t = 0, 0
    for i in range(m):
        # 计算模式串 p 的哈希值,假设d为256
        hash_p = (hash_p * d + ord(p[i])) % q  #这里就是实现几次方,345就是3*256的二次方+4*256加5*256的0次方
        # 计算文本串 T 中第一个子串的哈希值      其中ord()代表将值变成ASCII值
        hash_t = (hash_t * d + ord(T[i])) % q  #当hash_t hash_p过大时,q会生效,q一般是比较大,防止数值溢出
    power = pow(d, m - 1, q)  # 使用模幂运算,避免大数溢出  d 的 m-1 次方对 q 取模的结果
    for i in range(n - m + 1):    #这里是n-m+1 是因为如果文本字符串长度为5, 搜索的字符串长度为3,那就是有5-3+1=3种可能
        if hash_p == hash_t:  # 检查哈希值是否相等  
            # 如果哈希值相等,验证模式串和子串每个字符是否完全相同  
            if T[i:i + m] == p:  # 使用切片比较,避免额外的循环
                print( i )       #识别正确,打印位置值
                # 计算下一个相邻子串的哈希值
        if i < n - m:
            # 移除字符 T[i] 的哈希值贡献,这里滚动哈希
            hash_t = (hash_t - power * ord(T[i])) % q
            # 如果 hash_t 为负,则加上 q 使其非负  
            if hash_t < 0:
                hash_t += q
                # 增加字符 T[i + m] 的哈希值贡献
            hash_t = (hash_t * d + ord(T[i + m])) % q
            
 print(rabinKarp("abddsadabdjehwqqiabdoliqweoabd","abd",25,10011))    //进行验证
0
7
17
27  

总结

Rabin-Karp 算法在文本搜索、生物信息学(如 DNA 序列比对)、网络安全(如病毒检测)等领域有广泛应用。它特别适用于在大型文本数据集中快速查找模式串的场景。其次Rabin-Karp 算法是一种高效的字符串搜索算法,它通过哈希技术加速了搜索过程。该算法在大多数情况下表现良好,但需要注意处理哈希冲突和选择合适的哈希函数及参数。在适当的应用场景下,Rabin-Karp 算法可以显著提高字符串搜索的效率。

参考资料

文心一言
LeetCode 算法笔记(LeetCode-Notes)

自律每一天,fighting

标签:子串,Karp,hash,算法,哈希,Rabin
From: https://blog.csdn.net/zsy54577/article/details/139805627

相关文章

  • 目标检测经典算法及其应用
    目标检测是计算机视觉领域中的一项核心技术,它旨在让计算机能够像人眼一样识别和定位图像或视频中的物体。具体来说,目标检测不仅需要识别出图像或视频中有哪些对象,还要确定它们在图像或视频中的位置(通常以边界框的形式表示)以及它们的类别。目标检测的基本框架通常包括三个主要......
  • 算法设计与分析复习总结(一)
    算法分析与设计复习总结第一章算法概述算法与程序算法的四条性质程序的特点算法复杂度分析时间复杂度关于拉斯维加斯算法工作原理保证正确性的原因例子:快速选择算法(Quickselect)形式化证明结论计算模型基本计算模型NP完全性理论约化的概念几类问题的韦恩关系图P问题(P......
  • 算法训练营第六十七天 | 卡码网110 字符串接龙、卡码网105 有向图的完全可达性、卡码
    卡码网110字符串接龙这题一开始用的邻接表+dfs,不幸超时#include<iostream>#include<list>#include<string>#include<vector>usingnamespacestd;intminLen=501;boolcount(stringa,stringb){intnum=0;for(inti=0;i<a.lengt......
  • 基础算法(1)
    文章目录数学函数math.h(cmath)头文件float.h头文件拆位拆位进阶奇偶判断质数判断在c++中,会涉及到一些算法,例如递归、递推、动态规划(DP)、深搜(DFS)、广搜(BFS)……今天我们要说的是一些简单的算法数学函数math.h(cmath)头文件选择任意一个头文件#include<cmath>//仅......
  • 【Matlab】LSTM长短期记忆神经网络分类算法(附代码)
      资源下载: https://download.csdn.net/download/vvoennvv/89465998 分类算法资源合集:https://download.csdn.net/download/vvoennvv/89466519 目录MatlabSVM支持向量机分类算法MatlabRF随机森林分类算法MatlabRBF径向基神经网络分类算法MatlabPSO-BP基于粒子......
  • [算法篇] 简单讲讲一维前缀和与差分
    前缀和:先给定义:指某序列的前n项和是不是与我们高中所学的数列求和类似?给出用途: 如我们于一组长度为n的整数序列中询问m次,每次询问中输出区间[l,r]中数之和倘若我们先不使用前缀和,预测一下思路将会是:m次询问中,每一次都求和数组[l,r]时间复杂度为O(n),思路很简单但若m非常大则将......
  • 【面经】超全版本AIGC算法工程师面经
    AIGC算法工程师面经1.个人项目介绍1.1如何介绍1.2加分点1.3注意事项2.深度学习基础2.1公式理解类2.2模型训练通识3.细分算法3.1NLP问题3.2Transformer细节问题3.3大模型问题本篇为来自各大厂从业者等业内人士做的免费面经总结,希望能为想进入或者即将入......
  • [模式识别复习笔记] 第9章 神经网络及BP算法
    1.基本概念1.1神经元神经网络是很多的神经元模型按照一定的层次结构连接起来所构成的。1.2激活函数\(\text{ReLU}\)函数:修正线性单元ReLU,是一种人工神经网络中常用的激活函数。\[\text{ReLU}(x)=\max(0,x)\]\(\text{sgn}\)阶跃函数:它将输入值映射为......
  • 吴恩达机器学习 第三课 week2 推荐算法(上)
    目录01学习目标02推荐算法2.1定义    2.2应用2.3算法03 协同过滤推荐算法04电影推荐系统4.1问题描述4.2算法实现05总结01学习目标   (1)了解推荐算法   (2)掌握协同过滤推荐算法(CollaborativeFilteringRecommenderAlgorithm)原理  ......
  • 目标检测0:layman学习Faster-RCNN算法(基于VOC数据进行训练)
    分享:Bubbliiiing的学习小课堂博主的专栏《睿智的目标检测》中对Faster-RCNN有较为详细的描述。CSDN 链接:睿智的目标检测27——Pytorch搭建FasterR-CNN目标检测平台源代码下载  :https://github.com/bubbliiiing/faster-rcnn-pytorchB站讲解链接:配置Tensorflow+Keras......