Python中的拉宾卡普算法

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

Python中的拉宾-卡普算法

拉宾-卡普算法从一个给定的输入或值中找到特定的数字、字母或模式。当你需要从数据中提取洞察力时,机器学习算法通常是数据科学中的首选解决方案,但并非所有的算法都是平等的。

有些算法比其他算法更善于找到正确的洞察力,有些算法比其他算法更善于避免假阳性。寻找正确见解的最强大的机器学习算法之一是拉宾-卡普算法。

拉宾-卡普算法是用来寻找一组文本和可能的密码之间的最佳匹配。它主要用于软件中,帮助用户在忘记密码时找到他们的密码。

它最初是为寻找文本中的电子邮件地址而开发的,从那时起,它被用于许多其他应用,如寻找电话号码,从PDF中提取文本,等等。它是由Richard M. Rabin和Abraham S. Karp设计的。

Python中拉宾-卡普算法的复杂性

拉宾-卡普算法是一种有效地寻找数组中不同值的最小数量的方法。它已被证明在渐进上比其他常见的最小值搜索算法如二进制搜索、二次探测和顺序搜索要快。

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

在Python中实现Rabin-Karp算法

现在,让我们了解如何在我们的Python例子中实现拉宾-卡普算法。

我们将给出一个字符模式,然后检查给定模式在现有元素中的可能性。如果找到了这个模式,就把它作为输出。

首先,我们将指定增加的字符数作为输入。在我们的例子中,我们将指定15 ,如下所示。

# python
numOfChar = 15

我们将定义一个函数searchPattern ,它将接受三个参数。第一个参数将是我们想用拉宾卡普算法找到的模式。

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

我们将把模式和文本的长度分配给变量,这样我们就可以在以后使用这个长度。我们还将为模式和文本设置哈希值。

我们将在for 循环中定义变量ab

# 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算法,我们可以在一个给定的文本中找到多个位置的模式。