Algorithm 查找最大回文子串,算法复杂度

Algorithm 查找最大回文子串,算法复杂度,algorithm,dynamic-programming,palindrome,Algorithm,Dynamic Programming,Palindrome,您得到了一个字符串,例如“acdfdcqqc”,需要创建一个算法来查找最大的回文子字符串,在我们的例子中是“cdfdc”。通过创建一个大小为2n的数组,每次计算以该点为中心的最大回文的长度,很容易设计出一个O(n^2)算法,即: a - c - d - f - d - c - q - q - c 1 0 1 0 1 0 5 0 1 0 1 0 1 4 1 0 1 对于2n个可能的起始点中的每一个,我沿着两个方向移动,找到从该位置开

您得到了一个字符串,例如
“acdfdcqqc”
,需要创建一个算法来查找最大的回文子字符串,在我们的例子中是
“cdfdc”
。通过创建一个大小为2n的数组,每次计算以该点为中心的最大回文的长度,很容易设计出一个O(n^2)算法,即:

a  -  c  -  d  -  f  -  d  -  c  -  q  -  q  -  c
1  0  1  0  1  0  5  0  1  0  1  0  1  4  1  0  1
对于2n个可能的起始点中的每一个,我沿着两个方向移动,找到从该位置开始的最大回文的长度。所以对于2n个操作中的每一个,我最多做O(n)个操作,因此O(n^2)的时间复杂度

我知道它可以在线性时间内完成,使用更高级的算法:

但是假设我们正在处理的字符串是从自然英语文本中提取的。如果我们在英文文本中随机选择一个位置,我们可能期望找到的对称性相当低。我甚至会说,预期的符号是少于一个字符的每一面。 因此,我可以说我的算法做了2n次预期的常数时间运算,使算法平均为O(n)吗

没有

在算法设计中,说一个算法在预期的
O(n)
时间内运行,意味着它对每个可能的输入都这样做。也就是说,期望值应该是算法的随机性(内部投币),而不是输入是从受限集合中均匀随机选择的事实


然而,这并不意味着你的算法不好。可以使用这样一个事实,即输入仅限于英文文本,因此具有某些特性,使得算法比一般输入更快。但是您使用的术语(预期
O(n)
time)是为算法保留的,这些算法在每个输入上的运行时间预计为
O(n)

算法的预期运行时间是算法在所有可能输入上的平均运行时间。(参见的第5章。)正如教科书所指出的,解决这个问题并不总是容易的,有时使用另一种方法是有用的:在随机选择的输入上运行算法的时间。但原理是一样的:“预期运行时间”的概念是概率的,并且只适用于该算法的大量应用

相比之下,“最坏情况运行时间”是算法在任何输入(每个长度)上的最坏运行时间。这也不总是容易计算的,但它适合于最小上界计算,这在大O表示法的情况下是很好的,因为O(f(n))只表示f(n)是上界

如果将算法应用于受限输入集,则可以指定该受限集上的预期或最坏情况运行时间;如果输入在可能的输入范围内分布不均匀,则在计算预期运行时间时应将其考虑在内

在回文长度的情况下,如果输入是随机选择的英文文本的子字符串,则最大回文的预期长度为(略)大于从整个字符串中随机选择的文本的最大回文的预期长度,该字符串的字符从小写字母和空格字符集中提取。但对于这两组输入,最长回文的预期长度都是O(1)


因此,可以说您的算法是“预期的O(n)”,尽管您还应该指定输入字符串范围的性质。但是,如果您无法控制算法的输入,最坏情况下的运行时间也是相关的,因为很容易为您幼稚的算法设计最坏情况输入,因此对其进行DoS攻击显然是可行的。

这不是“预期”时间的意思。你在描述“最坏情况”的时间。快速排序应为O(n日志n);哈希表查找应为O(n);这两种说法都很常见。(最坏的情况分别是O(n²)和O(n)。哪个对您的用例更有用?@rici,虽然快速排序的最坏情况时间是O(n²),但它在每个输入上的预期运行时间是O(n)。错误的输入并不罕见,它们并不存在。另一方面,问题中描述的算法假设大多数输入是“好的”,因此它通常在O(n)中运行。但这并非意料之中。快速排序之所以快速,是因为其内部的随机性,而不是因为其输入的分布。我正在考虑所有关于平面图的算法,使用Eurler公式(仅适用于平面图)来计算平均复杂度。它们不处理最一般的图形情况。在平均时间复杂度的计算中嵌入一些先验知识似乎是可以的,只要语句中清楚地表明,我们只关注案例的子集。否?快速排序的错误输入显然存在。这就是现代库使用introsort或类似方法的原因。@user3091275,是的,将先验知识嵌入到运行时间的计算中是可以的,但在当前问题中,与平面图算法相反,先验知识并不适用于每一个输入,而仅适用于大多数输入。因此,建议的算法将无法在某些输入上具有预期的线性运行时间。