您的位置:首页 > 编程语言 > Python开发

字符串匹配算法 之 朴素字符串匹配

2016-07-04 19:49 435 查看

前言

字符串匹配问题的形式定义:

文本(Text)是一个长度为 n 的字符串:T;

模式(Pattern)是一个长度为 m 且 m≤n 的字符串:P;

T 和 P 中的元素都属于有限的字母表 Σ 表;

有效位移 (Valid Shift):

如果 0≤ s ≤n-m,并且 T[s+1..s+m] = P[1..m],即对 1≤j≤m,有 T[s+j] = P[j],则说模式 P 在文本 T 中出现且位移为 s,且称 s 是一个有效位移。

字符串匹配示意图如下:



比如上图中,目标是找出所有在文本 T = abcabaabcabac 中模式 P = abaa 的所有出现。该模式在此文本中仅出现一次,即在位移 s = 3 处,位移 s = 3 是有效位移。

本文介绍的是字符串匹配最简单的算法——朴素字符串匹配算法。该算法的原理非常简单,就是通过一个循环找到所有有效偏移,即对检查是否满足条件。算法没有进行预处理,只是对其进行匹配处理。

算法原理

算法复杂度

时间复杂度

时间复杂度是非常大: O((n-m+1)m)

空间复杂度

空间复杂度:O(m+n)

Python实现

# -*- coding: utf-8 -*-

def nativeStringMatcher(t, p):
'''
:param t: the string to check
:param p: pattern
'''
n = len(t)
m = len(p)
for s in xrange(0, n-m+1):
if p == t[s:s+m]:
print 'Pattern occurs with shift %d' % s
if __name__ == '__main__':
t = "CGTCGATCGCGCTACGTCGACGTACGGCAGCCAGCGACGTCGCTTTCACGACGTCGTCAGCACCGTCGGATCCGTCG"
p = "CGTCG"
nativeStringMatcher(t,p)


算法测试

执行完的结果如下:

Pattern occurs with shift 0
Pattern occurs with shift 14
Pattern occurs with shift 37
Pattern occurs with shift 51
Pattern occurs with shift 63
Pattern occurs with shift 72


总结

朴素字符串匹配是遍历一遍文本字符串,对于短文本还可以接受,如果文本过长或者模式串比较多,那就很麻烦了。

参考

cnblogs上的博客

oschina上的博客
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息