<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>KMP</title>
	<atom:link href="https://www.aitaocui.cn/tag/227091/feed" rel="self" type="application/rss+xml" />
	<link>https://www.aitaocui.cn</link>
	<description>翡翠玉石爱好者聚集地</description>
	<lastBuildDate>Sat, 26 Nov 2022 18:20:22 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.1.1</generator>

<image>
	<url>https://www.aitaocui.cn/wp-content/uploads/2022/11/taocui.png</url>
	<title>KMP</title>
	<link>https://www.aitaocui.cn</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>KMP(字符串匹配算法)</title>
		<link>https://www.aitaocui.cn/article/338821.html</link>
					<comments>https://www.aitaocui.cn/article/338821.html#respond</comments>
		
		<dc:creator><![CDATA[契可尼效应]]></dc:creator>
		<pubDate>Sat, 26 Nov 2022 18:20:22 +0000</pubDate>
				<category><![CDATA[知识]]></category>
		<category><![CDATA[KMP]]></category>
		<guid isPermaLink="false">https://www.aitaocui.cn/?p=338821</guid>

					<description><![CDATA[KMP算法是一种用于字符串匹配的算法，这个算法的高效之处在于当在某个位置匹配不成功的时候可以根据之前的匹配结果从模式字符串的另一个位置开始，而不必从头开始匹配字符串。 定义 一种由...]]></description>
										<content:encoded><![CDATA[</p>
<article>
<p>KMP算法是一种用于字符串匹配的算法，这个算法的高效之处在于当在某个位置匹配不成功的时候可以根据之前的匹配结果从模式字符串的另一个位置开始，而不必从头开始匹配字符串。</p>
</article>
<article>
<h1>定义</h1>
<p>一种由Knuth(D.E.Knuth)、Morris(J.H.Morris）和Pratt(V.R.Pratt）三人设计的线性时间字符串匹配算法。这个算法不用计算变迁函数δ，匹配时间为Θ（n），只用到辅助函数π[1，m]，它是在Θ（m）时间内，根据模式预先计算出来的。数组π使得我们可以按需要，“现场”有效的计算（在平摊意义上来说）变迁函数δ。粗略地说，对任意状态q=0，1，…，m和任意字符a∈Σ，π[q]的值包含了与a无关但在计算δ（q，a）时需要的信息。由于数组π只有m个元素，而δ有Θ（m∣Σ∣）个值，所以通过预先计算π而不是δ，使得时间减少了一个Σ因子。</p>
<h1>详细阐述</h1>
<p>当我们分析一个模式字符串时，例如：abcabcddes. 需要分析一下，每个字符x前面最多有多少个连续的字符和字符串从初始位置开始的字符匹配。然后+1就行了（别忘了，我们的字符串都是从索引1开始的）当然，不要相同位置自己匹配，默认第一个字符的匹配数是0。</p>
<p>设字符串为 x1,x2,x3&#8230;xn，其中x1，x2，x3，&#8230; xi，&#8230; xn均是字符，设ai为字符xi对应的整数。当且仅当满足如下条件：字符串x1x2&#8230;xm equals 字符串x(i-m+1）&#8230;xi-1 xi 并且x1x2&#8230;xm x(m+1） unequals x(i-m) x(i-m+1）&#8230;xi-1 xi，则a=m。</p>
<p>例如：</p>
<p>abcabcddes</p>
<p>0111234111</p>
<p>|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-默认是0</p>
<p>&#8211;| | |&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;不能自己在相同位置进行字符匹配，所以这里认为没有匹配字符串，所以0+1 =1，继续从1开始匹配</p>
<p>&#8212;&#8212;| | |&#8212;&#8212;&#8212;&#8211;前面的字符和开始位置的字符相同，所以是2,3,4</p>
<p>&#8212;&#8212;&#8212;&#8211;| | | |&#8212;&#8212;-不匹配只能取1。</p>
<p>希望能明白的是，如果开始字符是 Ch1的话，那么我们就是要在串中第2个Ch1后面的位置开始自己和自己匹配，计算最大的吻合度。但是这个不是最优的，因为他没有考虑aaaaaaaaaaaaaaaaaaab的情况，这样前面会出现大量的1，这样的算法复杂度已经和最初的朴素算法没有区别了。所以稍微改动一下：和朴素算法相比，只是修改一句话而已，但是算法复杂度从O(m*n) 变成了：O(m+n)。</p>
<h1>实际应用</h1>
<h2 id="a-c90d573e">摘要</h2>
<p>给定两个串S和T，长分别m和n，本文给出了一个找出二串间最大匹配的算法。该算法可用于比较两个串S和T的相似程度，它与串的模式匹配有别。</p>
<p>关键词</p>
<p>模式匹配 串的最大匹配 算法</p>
<p>Algorithm on Maximal Matching of Strings</p>
<p>Lin YuCai Xiang YongHong Zhang ChunXia Zhang JianJun</p>
<p>（Computer Science Department of Yunnan Normal University Kunming 650092）</p>
<p>ABSTRACT Given Two Strings S of length m and T of length n，the paper presents an algorithm which finds the maximal matching of them. The algorithm can be used to compare the similarility of the two strings S and T,it is different with the strings&#x27; pattren matching.</p>
<p>KEY WORDS Pattern Matching Maximal Matching of Strings Algorithm</p>
<h2 id="a-944c65d6">提出问题</h2>
<p>字符串的模式匹配主要用于文本处理，例如文本编辑。文本数据的存储（文本压缩）和数据检索系统。所谓字符串的模式匹配[2]，就是给定两个字符串S和T，长度分别为m和n，找出T中出现的一个或多个或所有的S，在这方面已经取得了不少进展。本文从文本处理的另一个角度出发，找出两个串的最大匹配，比较其相似程度。它主要应用于文本比较，特别是在计算机辅助教学中。显然前者要找S的完全匹配，而后者并无此要求。例如，若S=ABCD，T=EFABCDX，那么模式匹配的结果就是找出了T中的一个ABCD，而我们算法的结果就是S能与T的ABCD完全匹配，但是T中还有3个字符是比S多出来的，也就是说在S中有100%的字符与T中的匹配，而在T中有57%的字符与S中的匹配。若S= ABCDFE，T=AFXBECDY。则在模式匹配中S与T无匹配项，但在我们的算法中就能发现T中存在A，B，C，D，但D后不存在E，F。而且S中也存在A，B，C，D，且具有顺序性。这样就能公正地评价S，T的区别。得知其相似程度。</p>
<p>文章的组织如下：首先介绍基本定义和问题的描述；第三节是算法设计；最后是本文总结。</p>
<h2 id="a-61d82fb9">问题描述</h2>
<p>设∑为任意有限集，其元称为字符，w：∑→N为∑到N的函数，称为∑的权函数（注：本文仅讨论权值恒为1的情况）。∑*为∑上的有限字符串集合，那么对任意S，T∈∑*，设S=a1a2…am，T=b1b2…bn，m&gt;0，n&gt;0。记&lt;m&gt;={1,2，…，m},&lt;n&gt;={1,2，…，n}，则称{(i,j）∣i∈&lt;m&gt;；，j∈&lt;n&gt;；，ai=bj}为S与T的匹配关系集，记作M（S，T），称M为S与T的一个（容许）匹配，若对任意（i,j），（i&#x27;,j&#x27;）∈，① i&lt; i&#x27;，当且仅当j&lt; j&#x27;，② i= i&#x27;当且仅当j= j&#x27;。S与T的匹配中满足 最大者，称为S与T的最大匹配。若C(i,j）为N上的m×n矩阵，且满足：</p>
<p>则称矩阵C为串S与T的匹配关系阵。</p>
<p>于是求串S与T的最大匹配，等价于求C中的一个最大独立点集M，它满足，若ci,j，ci&#x27;,j&#x27;∈M，则i&lt; i&#x27; 当且仅当j&lt; j&#x27;，i=i&#x27;当且仅当j=j&#x27;。我们称这样的最大独立点集为C的最大C-独立点集。</p>
<p>例：设∑为所有字母的集合，对任意x∈∑，w（x）≡1，设S与T分别为：S=“BOOKNEWS”，T=“NEWBOOKS”。则我们可以得到S与T两个匹配：</p>
<p>这里=5；</p>
<p>这里=4。</p>
<p>显然为串S与T的最大匹配。</p>
<p>S与T的匹配关系阵C可表示如下：</p>
<p>其中带圈的部分为一最大C-独立点集。</p>
<p>设计</p>
<p>我们仅就权值为一的情况进行讨论。</p>
<p>设S和T为任意给定串，C为的S与T匹配关系阵，那么由2的讨论知，求S与T的最大匹配问题，等价于求C的最大C-独立点集问题。因而，为了解决我们的问题，只要给出求C的最大C-独立点集的算法就可以了。</p>
<p>显然，为了求出C的最大C-独立点集，我们可以采用这样的方法：搜索C的所有C-独立点集，并找出它的最大者。这种方法是可行的，但并不是非常有效的。这会使问题变得很繁，复杂度很大。因此，我们先对问题进行分析。</p>
<p>在下面的讨论中，我们把C的任一C-独立点集={ai1,j1，…，ais,js}，记作=ai1,j1…ais,js，i1 &lt;；…&lt; is。于是可看作阵C中以1为节点的一条路，满足：对路中的任意两节点，均有某一节点位于另一节点的右下方。称这种路为右下行路。</p>
<p>于是求C-独立点集等价于求阵C的右下行路。这种求右下行路的搜索可以逐行往下进行。</p>
<p>命题1. 若 =αai,jβ和ψ=α&#x27;ai,jσ为C的两个C-独立点集，且α为α&#x27;的加细，则存在C-独立点集&#x27;=αai,jδ，满足≥。</p>
<p>命题2. 若 =αai,jβ和ψ=α&#x27;ai+k,jσ为C的两个C-独立点集，且≥，则存在C-独立点集&#x27;=αai,jδ，满足≥。</p>
<p>命题3. 若 =αai,jβ和ψ=α&#x27;ai,j+kσ为C的两个C-独立点集，且≥，则存在C-独立点集&#x27;=αai,jδ，满足≥。</p>
<p>由命题1知，在搜索右下行路的过程中，如果已获得了某一C-独立点集的某一初始截段αai,j和另一C-独立点集ψ的某一初始截段α&#x27;ai,j，且有≤，则我们可以停止对ψ的进一步搜索。</p>
<p>由命题2知，在搜索右下行路的过程中，在某一列j存在某两个C-独立点集的某初始截段=ai1,j1…ais,j和ψ=al1,m1…alt,j，如果≥，但lt&gt;is，则我们可以停止对ψ的进一步搜索。</p>
<p>由命题3知，在搜索右下行路的过程中，在某一行i存在某两个C-独立点集的某初始截段=ai1,j1…ai,js和ψ=ai1,m1…ai,mt，如果≥，但mt&gt;js，则我们可以停止对ψ的进一步搜索。</p>
<p>由此可见，并不要求搜索所有C的最大C-独立点集，而可以采用比这简单得多的方法进行计算。那么按照我们上面的三个命题，来看如下实例：</p>
<p>首先我们得到=B（在上的节点用①表示），我们向右下方找路，可以发现，在第4列有两个1，根据命题2，我们选择上面的一个1，也就是说选择第1行的那个1，而不要第2行的那个1。同时我们也发现在第1行也有两个1，由命题3知，我们选择左边的那个1，即第4列的那个1。此时=BO。但是当我们的算法运行到第4行时，=BOOK，由于K在第3行第6列，而本行的1在第1列，在路最后一个节点K的左边，那么我们必须新建一条路ψ，因为我们并不能确定是否以后就有≥，当算法运行到第6行时，=BOOK，ψ=NEW，=4，=3，我们将S链到路上，此时我们得到最长右下行路=BOOKS，=5。这样我们就可以计算出这两个字符串的匹配程度。</p>
<p>在我们的算法设计过程中，用到了两个技巧。技巧之一，矩阵C不用存储，是动态建立的，节省了空间。技巧之二，本算法并不要求所有的S与T中所有的元素都相互进行比较，也并不存储所有的右下行路，节省了时间和空间。由矩阵中1的出现情况可见，本算法所需的空间和时间都远小于O（mn）</p>
<h2 id="a-191087f2">结束语</h2>
<p>本文给出了一个与模式匹配不同的，具有若干应用的，串的最大匹配算法，该算法已经在机器上实现，达到了预期的效果。本文仅讨论权值恒为1的情况，对于权值任意的情形不难由此得到推广。</p>
</article>
<div class="mt-3 mb-3" style="max-width: 770px;height: auto;">
                                    </div>
<div class="mt-3 mb-3" style="max-width: 770px;height: auto;">
                                    </div>
<div class="mt-3 mb-3" style="max-width: 770px;height: auto;">
                                    </div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.aitaocui.cn/article/338821.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
