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
循环中定义变量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)
输出:
正如你所看到的,我们的模式在三个不同的位置被发现。使用Rabin-Karp算法,我们可以在一个给定的文本中找到多个位置的模式。