<?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>Suffix Array &#8211; HU Xiaoxu</title>
	<atom:link href="https://blog.ihuxu.com/tag/suffix-array/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.ihuxu.com</link>
	<description>a software engineer&#039;s blog</description>
	<lastBuildDate>Sat, 21 Jun 2025 01:44:54 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.2</generator>
	<item>
		<title>后缀数组（Suffix Array）</title>
		<link>https://blog.ihuxu.com/suffix-array/</link>
					<comments>https://blog.ihuxu.com/suffix-array/#respond</comments>
		
		<dc:creator><![CDATA[HU Xiaoxu]]></dc:creator>
		<pubDate>Tue, 22 Oct 2019 09:14:45 +0000</pubDate>
				<category><![CDATA[Basic Data Structure]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Data Structure and Algorithm]]></category>
		<category><![CDATA[Original]]></category>
		<category><![CDATA[String]]></category>
		<category><![CDATA[Suffix Array]]></category>
		<guid isPermaLink="false">http://blog.ihuxu.com/?p=11466</guid>

					<description><![CDATA[本文介绍后缀数组的定义与构建的过程。首先，文章介绍什么是后缀数组，随后讲解了最自然的朴素算法。为了引出更高效的算法，文章提及了倍增思想与基数排序的背景基础知识。接着，通过模拟演练的方式一步一步地演示如何创建后缀数组。将构建的抽象过程形象地展示出来，使读者更易理解。 定义 给定字符串，其所有后缀有。（6为字符串的长度）。如下所示： S = "banana" s1 = "banana" s2 = "anana" s3 = "nana" s4 = "ana" s5 = "na" s6 = "a" 后缀数组即为由构成的有序的（字典序升序排列的）字符串数组。 构建后缀数组的动态过程演示动画： https://visualgo.net/zh/suffixarray 思路 如何构建后缀数组？ 若字符串的长度为，那么有个后缀。先考虑朴素算法，将个字符串进行排序，需要，此外每一次比较两个字符串大小时需要枚举字符串的长度。故： 时间复杂度： 倍增思想 朴素算法是将所有后缀字符串进行排序，其中每一个都是完整的后缀。那么，这里能否从后缀字符串的长度入手，以后缀字符串的长度为规模将问题进行分解——先排序后缀字符串长度较小的情况，再排序长度较大的情况，依次递推。 那么，在递增后缀字符串的长度时，如果以线性方式进行递推，那么在时间上仍然不会有很好的改善。此时，可以通过成倍增长（倍增）的方式进行递推，只递推状态空间中在2的整数次幂位置上的值。在计算某一个值时，可以利用之前计算过的状态空间的值拼成所需的值即可。 在计算每一个后缀字符串长度时，两两比较字符串只需要的时间，将当前长度的后缀进行排序需要的时间为。长度递增次，所以一共需要的时间为。 基数排序 我们知道基数排序是一种稳定的（大小相同的元素在排序后，其相对位置不变）线性时间复杂度——的排序算法，可以将其融入到上述中的字符串排序中。可以将时间复杂度整体降到。 模拟演算 排序长度为的后缀数组 使用ASCII计算每一个后缀数组的第一个字符的权重（Rank）。 Index Suffix Rank 0 banana 2 1 anana 1 2 nana 14 3 ana 1 4 na 14 5 a 1 为了能够计算出长度为2的后缀数组的顺序，还需要保留右边相邻字符的权重（Next Rank）。如果，当前字符已为最后一个，那么相邻字符的权重可认为是最小值0。 Index Suffix Rank Next Rank 0 banana<div class="read-more"><a class="btn read-more-btn" href="https://blog.ihuxu.com/suffix-array/">Read More</a></div>]]></description>
		
					<wfw:commentRss>https://blog.ihuxu.com/suffix-array/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
