迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

Python 中的 Rabin-Karp 算法

作者:迹忆客 最近更新:2023/06/30 浏览次数:

我们将介绍 Python 中的 Rabin-Karp 算法,并讨论如何在 Python 程序中使用它。


Python 中的 Rabin-Karp 算法

Rabin-Karp 算法从给定的输入或值中查找特定的数字、字母或模式。 当您需要从数据中提取见解时,机器学习算法通常是数据科学中的首选解决方案,但并非所有算法都是一样的。

有些人比其他人更善于找到正确的见解,有些人比其他人更擅长避免误报。 Rabin-Karp 算法是寻找正确见解的最强大的机器学习算法之一。

Rabin-Karp 算法用于查找一组文本和可能的密码之间的最佳匹配。 它主要用在软件中,帮助用户在忘记密码时找到密码。

它最初是为查找文本中的电子邮件地址而开发的,从那时起,它已被用于许多其他应用程序,例如查找电话号码、从 PDF 中提取文本等等。 它是由理查德·M·拉宾和亚伯拉罕·S·卡普设计的。

Python 中 Rabin-Karp 算法的复杂性

Rabin-Karp 算法是一种有效查找数组中最少数量的不同值的方法。 事实证明,它比二分搜索、二次探测和顺序搜索等其他常见的最小查找算法渐近更快。

然而,Rabin-Karp 算法通常比其理论最坏情况复杂度 (O(n)) 复杂得多,其中 n 是搜索数组中不同值的数量。 我们之所以如此复杂,是因为 Rabin-Karp 算法必须重复访问搜索数组中的每个值,直到找到所需的值。

用 Python 实现 Rabin-Karp 算法

现在,让我们了解如何在 Python 示例中实现 Rabin-Karp 算法。

我们将给出一个字符模式,然后检查给定模式对现有元素的可能性。 如果找到该模式,则将其作为输出。

首先,我们将分配作为输入添加的字符数的值。 在我们的例子中,我们将分配 15,如下所示。

# python
numOfChar = 15

我们将定义一个函数 searchPattern ,它将接受三个参数。 第一个参数是我们想要使用 Rabin-Karp 算法找到的模式。

第二个参数是我们要在其中寻找模式的文本。 最后一个参数是素数。

我们将模式和文本的长度分配给变量,以便稍后使用该长度。 我们还将设置模式和文本的哈希值。

我们将在 for 循环中定义变量 a 和 b。

# python
def searchPattern(pattern, text, primeNum):
    patLen = len(pattern)
    txtLen = len(text)
    a = 0
    b = 0
    p = 0 # hash value for pattern
    t = 0 # hash value for txt
    h = 1

从Rabin-Karp算法中,我们首先使用公式 pow(numOfChar, patLen-1)% primeNum 求出h的值,如下所示。

# python
for a in xrange(patLen-1):
    h = (h * numOfChar)% primeNum

现在,我们将找到该模式的哈希值和文本的第一个窗口,如下所示。

# python
for a in xrange(patLen):
        p = (numOfChar * p + ord(pattern[a]))% primeNum
        t = (numOfChar * t + ord(text[a]))% primeNum

我们将创建另一个 for 循环,将图案逐个滑动到文本上。 在这个 for 循环中,我们将检查当前文本和模式窗口的哈希值。

如果哈希值匹配,我们将一一检查字符,如下所示。

# python
for a in range(txtLen-patLen + 1):

        if p == t:
            for b in range(patLen):
                if text[a + b] != pattern[b]:
                    break

            b+= 1
            if b == patLen:
                print("Pattern found at index " + str(a))

        if a < txtLen-patLen:
            t = (numOfChar*(t-ord(text[a])*h) + ord(text[a + patLen]))% primeNum

            if t < 0:
                t = t + primeNum

现在,让我们为参数赋值并调用该函数来检查它是如何工作的,如下所示。

# python
text = "ABBAABCDEAABBDCAABB"
pattern = "ABB"
primeNum = 101
searchPattern(pattern, text, primeNum)

输出:

Python 中的 Rabin-Karp 算法示例

正如您所看到的,我们的模式是在三个不同的位置发现的。 使用 Rabin-Karp 算法,我们可以在给定文本的多个位置找到模式。

上一篇:Python 中的后台进程

下一篇:没有了

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Python 中的后台进程

发布时间:2023/06/30 浏览次数:129 分类:Python

我们将介绍如何在后台运行Python脚本作为后台进程。 我们还将介绍Python中的pythonw。Python 中的后台进程

Python 3 中的 Urllib2

发布时间:2023/06/30 浏览次数:92 分类:Python

在本篇文章中,我们的目标是探索解决 Python 中 ModuleNotFoundError: No module named 'urllib2' 问题的方法。Python 3 中的 urllib

Python 中的邻接矩阵

发布时间:2023/06/29 浏览次数:108 分类:Python

Python 中使用图数据结构来表示各种现实生活中的对象,例如网络和地图。 我们可以使用邻接矩阵来表示图。本文将讨论在 Python 中实现邻接矩阵的不同方法。创建邻接矩阵

NumPy 相关函数

发布时间:2023/06/29 浏览次数:68 分类:Python

本篇文章介绍了Python中NumPy库的相关函数 np.corrcoef() 函数。NumPy 中的相关性 相关系数是一个数字值,表示数据集给定特征之间的关系。

在 Python 中将 Unicode 转换为 ASCII

发布时间:2023/06/29 浏览次数:125 分类:Python

通过本文,我们将学习如何将 Unicode 编码为字节,了解系统编码的不同方法以及在 Python 中将 Unicode 转换为 ASCII。在 Python 中将 Unicode 转换为 ASCII

从 Python 程序中运行 PowerShell 脚本

发布时间:2023/06/29 浏览次数:90 分类:Python

本文将重点讨论从 Python 代码执行 PowerShell 逻辑。Python subprocess.Popen()方法 在Python中,可以使用 subprocess.Popen() 方法执行外部程序。

解决 Python中错误 Overflow Encountered in Double_Scalars

发布时间:2023/06/29 浏览次数:120 分类:Python

通常,这些数字的大小变得如此之大,以至于程序进入溢出状态并显示警告 overflow encountered in double_scalars。 本文将解释双标量中的溢出、导致此问题的某种情况以及如何解决它。

解决 C++ 中错误 Python.h: No Such File or Directory

发布时间:2023/06/29 浏览次数:96 分类:Python

本文将解释如何解决错误 'Python.h': No such file or directory。 当我们尝试在 C++ 中嵌入 Python 代码,但编译器无法在系统内部找到对 Python 的引用时,通常会发生这种情况。C++ 中 'Python.h': No such file

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便