【问题标题】:4 sum time complexity4 总时间复杂度
【发布时间】:2018-02-14 05:37:50
【问题描述】:

这是典型的 4sum 问题。
给定一个包含 n 个整数的数组 S,S 中是否存在元素 a、b、c 和 d 使得 a + b + c + d = target?在给出目标总和的数组中找到所有唯一的四元组。

我知道的一种解决方案需要 O(n^3) 时间。但是当我分析最小时间复杂度时,我被以下陈述弄糊涂了:“由于 4 个数字会有 O(n^4) 种组合,在最坏的情况下,它们可能都加起来为目标数字,因此我们必须至少访问每个组合一次。因此,最小时间复杂度为 O(n^4)。

我知道这句话显然是错误的(毕竟存在 O(n^3) 算法),但不知道为什么。

我知道这可能是一个愚蠢的问题......但我真的对此感到困惑。任何人都可以帮忙吗?提前致谢。

【问题讨论】:

  • 不能从组合数到步数下结论。如果这是真的,排序将需要 O(n!) 个步骤。

标签: algorithm time-complexity big-o


【解决方案1】:

这是因为问题要求 4 个数字的所有 唯一 组合给出指定的总和。让我们看看细节。如果引用的句子

由于 4 个数字会有 O(n^4) 种组合,所以在 在最坏的情况下,它们可能都加起来为目标数,因此我们 必须至少访问每个组合一次。因此, 最小时间复杂度为 O(n^4)。

是真的,这意味着类似的 2-Sum 问题具有最小的时间复杂度O(n^2),对吧?但是,我们都知道事实并非如此。那是因为我们不必检查所有对来查找所有 unique 对。假设相反,即所有对的总和为指定的总和,并且都是唯一的,因此我们需要全部检查它们。这意味着我们可以从数组中找到四个不同的整数a, b, c, d,例如a + b = sc + d = s,还有a + c = sb + d = s。这意味着2a + b + c = 2d + b + ca = d,这给出了b = c。因此,(a,b) = (c,d),所以所有对都是唯一的假设是错误的,是矛盾的。因此,如果我们处理了(a,b) 对,我们可以跳过(c,d),因为它是同一对。这就是具有O(n^3) 复杂性的算法在 4-Sum 问题的情况下所做的事情,它们通过在开始时对输入数组的元素进行排序或散列来利用这一事实。可以找到一些巧妙的解决方案here

【讨论】:

  • 抱歉回复晚了,非常感谢您的解释!也就是说,因为不会有 o(n^4) 种唯一的组合,所以时间复杂度会比 o(n^4) 更好吧?
  • @Patrick 没错。如果您需要检查所有n^4 组合,那么没有办法比O(n^4) 做得更好,您引用的内容将是正确的。但幸运的是,这不是必需的。
猜你喜欢
  • 2016-02-13
  • 2012-08-14
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 2018-08-02
相关资源
最近更新 更多