python实现BM和KMP算法

1.KMP算法

 

ExpandedBlockStart.gif 代码
def  compute_prefix_function(p):
    m 
=  len(p)
    pi 
=  [0]  *  m
    k 
=  0
    
for  q  in  range( 1 , m):
        
while  k  >  0  and  p[k]  !=  p[q]:
            k 
=  pi[k  -   1 ]
        
if  p[k]  ==  p[q]:
            k 
=  k  +   1
        pi[q] 
=  k
    
return  pi

def  kmp_matcher(t, p):
    n 
=  len(t)
    m 
=  len(p)
    pi 
=  compute_prefix_function(p)
    q 
=  0
    
for  i  in  range(n):
        
while  q  >  0  and  p[q]  !=  t[i]:
            q 
=  pi[q  -   1 ]
        
if  p[q]  ==  t[i]:
            q 
=  q  +   1
        
if  q  ==  m:
            
return  i  -  m  +   1
    
return   - 1

 

2.BM算法例子

 

ExpandedBlockStart.gif 代码
def  BoyerMooreHorspool(pattern, text):
    m 
=  len(pattern)
    n 
=  len(text)
    
if  m  >  n:  return   - 1
    skip 
=  []
    
for  k  in  range( 256 ): skip.append(m)
    
for  k  in  range(m  -   1 ): skip[ord(pattern[k])]  =  m  -  k  -   1
    skip 
=  tuple(skip)
    k 
=  m  -   1
    
while  k  <  n:
        j 
=  m  -   1 ; i  =  k
        
while  j  >=  0  and  text[i]  ==  pattern[j]:
            j 
-=   1 ; i  -=   1
        
if  j  ==   - 1 return  i  +   1
        k 
+=  skip[ord(text[k])]
    
return   - 1

if   __name__   ==   ' __main__ ' :
    text 
=   " this is the string to search in "
    pattern 
=   " the "
    s 
=  BoyerMooreHorspool(pattern, text)
    
print   ' Text: ' ,text
    
print   ' Pattern: ' ,pattern
    
if  s  >   - 1 :
        
print   ' Pattern \" '   +  pattern  +   ' \" found at position ' ,s

 

 

这两个算法主要应用于字符串匹配。网上评论说BM性能优于KMP,我没验证过。改天可以用cProfile测试一下。

 

ps:今天分别用这两个算法,查找了69K文档的最后一行字符串,KMP用了0.053个CPU时间,BM仅用了0.025个CPU时间。

其实我非常想看一下sunday算法,据说是BM的改进,提升不少性能。研究了一下算法,是人性多了。但是现在网上没有它的python实现,改天尝试搞一个出来。

转载于:https://www.cnblogs.com/yd1227/archive/2010/10/28/1863990.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值