【问题标题】:Find largest palindromic substring, algorithm complexity查找最大回文子串,算法复杂度
【发布时间】:2016-12-05 06:34:18
【问题描述】:

给你一个字符串,例如"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)。

我知道它可以使用更高级的算法在线性时间内完成:https://en.wikipedia.org/wiki/Longest_palindromic_substring

但假设我们正在处理的字符串是从自然英文文本中提取的。如果我们在英文文本中随机选择一个位置,我们可能期望找到的预期对称性非常低。我什至会说预期的对称性在每一侧都少于一个字符。 因此,我可以说我的算法正在执行 2n 次预期的恒定时间操作,从而使算法平均为 O(n) 吗?

【问题讨论】:

    标签: algorithm dynamic-programming palindrome


    【解决方案1】:

    没有。

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

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

    【讨论】:

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

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

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

    如果您对一组受限输入应用算法,您可以指定该受限集的预期或最坏情况运行时间;如果输入不是均匀分布在可能的输入范围内,则在计算预期运行时间时应考虑到这一点。

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

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

    【讨论】:

      猜你喜欢
      • 2019-02-16
      • 2018-09-09
      • 2020-12-14
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 1970-01-01
      相关资源
      最近更新 更多