Three kinds of Pattern-Matching Algorithm in Python

本文深入探讨了三种经典的字符串匹配算法:蛮力搜索、Boyer-Moore算法和Knuth-Morris-Pratt(KMP)算法。通过详细的代码示例和运行时间分析,帮助读者理解每种算法的工作原理及效率,特别强调了KMP算法在O(n+m)时间复杂度上的优越性。
  1. Brute-Force
    code
def find_brute(T, P):      
#this function will return the lowest index of string T at which substring P begins
#else return -1 
	n, m =  len(T), len(P)
	for i in range(n-m+1):					#try every potental starting index in str T
		k = 0								#mark the length of the str P
		while k < m and T[i+k] == P[k]:		#kth character in P mathces
			k+=1		
		if k==m:							#reach the end of pattern
			return i						#return the lowest index of T
	return -1								#find pattern failed

In this algorithm, the worst-case running time is O(nm)

  1. The Boyer-Moore Algorithm
    In this algorithm, we use i to represent the index of the mismatched character in the text;
    j represent index of the last occurrence of T[i]within the pattern; and k represent the corresponding index in the pattern.
    It’s worthy to be cautious ,there are two cases when we are doing pattern-matching: whether its last occurrence is before or after the character of the pattern that was aligned with the mismatched.
    for example:

j < k or j > k, we have to shift i and k in different ways.
在这里插入图片描述
code:

def Boyer-Moore(T,P)
	n, m = len(T), len(P)
	last = {}
	for k in range(m)		#create the hash table to represent 'last' function
		last[P[k]] = k	
	i = m-1		#initiate i and j
	k = m-1
	while i < n:
		if T[i] == P[k]:		#if index i in text match index j in pattern
			if k == 0:		#the whole pattern match 
				return i		#return the first index
			else:
				k -= 1		
				i -= 1
		else:
			j = last.get(T[i])		#get j
			i += m-min(k, j+1)		
			k = m-1		#restart at the end of pattern
  1. The Knuth-Morris-Pratt Algorithm (KMP Algorithm)
    In ‘Data Structure and Algorithm in Python’, It use a list named fail[] to help implement the KMP algorithm. It’s similar to the ‘next array’ which we may be more familiar.And we use pattern P to match itself to get the ‘fail list’
    code:
def compute_kmp_fail(P):
	m = len(P)
	fail = [0]*m	#initiate the list fail
	i = 1
	k = 0
	while i<m:
		if P[i] == P[k]
			fail[i] = k+1	# k + 1 characters match thus far 
			k += 1
			i += 1
		elif k>0:
			k = fail[k-1]
		else:		# no match found starting at i
			i += 1
	return fail

def KMP(T,P):
	n, m = len(T), len(P)
	i = 0
	k = 0
	while i < n:
		if T[i] == P[k]:
			if k == m-1		#match complete
				return i-m+1
			i += 1
			k += 1
		elif k > 0:		 #P[k] mismatch T[i]
			k = fail[k-1]		  #k restart from P[fail[k-1]],reuse the suffix of P[0:k]
		else:
			i += 1
	return -1		
			

This algorithm archives a running time O(n+m), which is asymptotically optimal

下载前必看:https://pan.quark.cn/s/a4b39357ea24 在本资料中,将阐述如何运用JavaScript达成单击下拉列表框选定选项后即时转向对应页面的功能。 此种技术适用于网页布局中用户需迅速选取并转向不同页面的情形,诸如网站导航栏或内容目录等场景。 达成此功能,能够显著改善用户交互体验,精简用户的操作流程。 我们须熟悉HTML里的`<select>`组件,该组件用于构建一个选择列表。 用户可从中选定一项,并可引发一个事件来响应用户的这一选择动作。 在本次实例中,我们借助`onchange`事件监听器来实现当用户在下拉列表框中选定某个选项时,页面能自动转向该选项关联的链接地址。 JavaScript里的`window.location`属性旨在获取或设定浏览器当前载入页面的网址,通过变更该属性的值,能够实现页面的转向。 在本次实例的实现方案里,运用了`eval()`函数来动态执行字符串表达式,这在现代的JavaScript开发实践中通常不被推荐使用,因为它可能诱发安全问题及难以排错的错误。 然而,为了本例的简化展示,我们暂时搁置这一问题,因为在更复杂的实际应用中,可选用其他方法,例如ES6中的模板字符串或其他函数来安全地构建和执行字符串。 具体到本例的代码实现,`MM_jumpMenu`函数负责处理转向逻辑。 它接收三个参数:`targ`、`selObj`和`restore`。 其中`targ`代表要转向的页面,`selObj`是触发事件的下拉列表框对象,`restore`是标志位,用以指示是否需在转向后将下拉列表框的选项恢复至默认的提示项。 函数的实现通过获取`selObj`中当前选定的`selectedIndex`对应的`value`属性值,并将其赋予`...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值