<?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>一花一世界 &#187; KMP算法</title>
	<atom:link href="http://www.juliuschen.com/archives/tag/kmp%e7%ae%97%e6%b3%95/feed" rel="self" type="application/rss+xml" />
	<link>http://www.juliuschen.com</link>
	<description>谈笑间，樯橹灰飞烟灭</description>
	<lastBuildDate>Sun, 29 Aug 2010 10:32:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>KMP算法</title>
		<link>http://www.juliuschen.com/archives/21.html</link>
		<comments>http://www.juliuschen.com/archives/21.html#comments</comments>
		<pubDate>Sun, 24 Jan 2010 06:27:25 +0000</pubDate>
		<dc:creator>Julius Chen</dc:creator>
				<category><![CDATA[Strings]]></category>
		<category><![CDATA[KMP算法]]></category>
		<category><![CDATA[前缀函数]]></category>
		<category><![CDATA[字符串算法]]></category>
		<category><![CDATA[有限自动机]]></category>
		<category><![CDATA[模式匹配]]></category>

		<guid isPermaLink="false">http://www.juliuschen.com/archives/21.html</guid>
		<description><![CDATA[KMP算法是字符串匹配的一种改进算法，在1977年由D. E. Knuth，J. H. Morris和V. R. Pratt一起提出，并以他们名字的首字母命名。和朴素的模式匹配算法相比，KMP算法最大的特点就是主串指针不回溯。它利用已经得到的“部分匹配”信息来减少不必要的比较而加快字符串的匹配速度。 KMP算法的本质 KMP算法本质上是实现了对自动机的模拟。它通过构造一个有限自动机来搜寻某给定的模式在正文中出现的位置。整个算法的核心就是对自动机的构建（或前缀函数的构建，KMP算法不用计算变迁函数，而是根据模式预先计算出一个辅助函数next来实现更快速的状态切换），当完成有限自动机的构建之后对主串的搜寻就显得很简单了。 前缀函数next的构建 模式的前缀函数包含有模式与其自身的位移进行匹配的信息。这些信息可用于避免在朴素的模式匹配算法中对无用位移的测试。比如主串和模式串在主串指针为Ti、模式串指针为Pj处匹配失败时，可以主串指针不回溯并直接取next函数的值next[j] = k将模式串向右滑动到第k个字符处重新开始比较，而不用去做无用位移的测试。只是这样的操作能成立k必须要满足一定的条件，如下所示： 首先，如果模式串能直接向右滑动到第k个字符处重新开始比较则说明模式串中的前k-1个字符必然已经和主串匹配了，也即必然已经有下面式子，且为了能最大化的向右移动则不能存在更大的k&#8217;满足下面式子： ： P1 P2 &#8230; Pk-1 = Ti-k+1 Ti-k+2 &#8230; Ti-1 而由已经比较所得的“部分匹配”信息可知： ： Pj-k+1 Pj-k+2 &#8230; Pj-1 = Ti-k+1 Ti-k+2 &#8230; Ti-1 因此由式子和式子我们可以推得： ： P1 P2 &#8230; Pk-1 = Pj-k+1 Pj-k+2 &#8230; Pj-1 也就是k必须要满足式子的条件！由这个式子也可以看出k就是模式中第j个字符所拥有的最长真后缀同时是模式前缀的串的长度，且k的取值和主串T无关！ 那有了式子之后如何去求模式的每个字符所对应的k(next[j])的值呢？ 由上面结论可知，当j = 0时next[j] = -1，因为第一个字符没有真后缀同时是模式的前缀。其他情况时，next[j]则可以由它前一个位置字符的next值推出。 比如我们要求next[j+1]，假设已有next[j] = [...]]]></description>
		<wfw:commentRss>http://www.juliuschen.com/archives/21.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- www.000webhost.com Analytics Code -->
<script type="text/javascript" src="http://analytics.hosting24.com/count.php"></script>
<noscript><a href="http://www.hosting24.com/"><img src="http://analytics.hosting24.com/count.php" alt="web hosting" /></a></noscript>
<!-- End Of Analytics Code -->
