【问题标题】:Big-O notation for a pairing operation配对操作的大 O 表示法
【发布时间】:2012-04-19 16:19:49
【问题描述】:

对于配对操作,我很难理解大 O 符号。问题很简单——为数组中给定的数字列表生成所有可能的对。

我的第一个猜测是有一个嵌套的 for/foreach 循环并生成对。这很容易,我得到每个 n,我分析 n 个其他数字,这给了我 n^2 的复杂度。

现在,如果我尝试进一步优化它并说 (1,4) 与 (4,1) 相同,那么对于像 1,2,3,4,5 这样的排序数组。我只以这种方式在嵌套的 for 循环中运行配对操作

for (i =0; i < count; i++) {
    for (j = i + 1; j < count - 1; j++)
    }
}

在这种情况下,我只运行了数组

上下文:我接受了一个类似问题的采访,这源于我和朋友的一次争论,如果列表中的配对操作可以比 n^2 更好。

【问题讨论】:

  • 我相信你应该使用j &lt;= count - 1

标签: arrays algorithm list big-o


【解决方案1】:

您是正确的,您执行的操作少于 n2 个操作。问题是您减少了多少操作。

让我们考虑一下数组中有多少对。如果 n 个数字中的每一个都可以与 (n - 1) 个其他数字配对,则可能的配对总数为 n(n - 1)。原始 for 循环的每次迭代都会生成其中一个对,因此您生成的对的总数为 n2 - n,即 O(n2)。

现在,如果您通过说 (1, 4) 和 (4, 1) 相同来消除重复对,那会怎样?在这种情况下,请注意您生成的一半对将是无关的 - 您将生成每对两次。这意味着对的数量是 (n2 - n) / 2。这个表达式小于 n2,但是注意它仍然是 O(n2) 因为 big-O 表示法忽略了常量。

换句话说 - 你是对的,你生成的对少于 n2 对,但你创建的对的总数仍然是 O(n2 )。

更一般地说 - 如果您曾经将算法所做的工作总量减少了某个常数因子(例如,您将工作量减少了一半,或者将工作量减少了 100 倍),那么您并没有改变大-O 算法的运行时间。 Big-O 完全忽略常量。为了减少 big-O 运行时间,您需要将总工作量减少一个大于常数的量;比如说,乘以 n、log n 等因子。

希望这会有所帮助!

【讨论】:

  • 是的,你是对的。我只需要说服自己即使在优化之后我的解决方案仍然是 n^2 。说到这里,你知道比 n^2 更好的配对解决方案吗?
  • @kosh- 假设数组元素是不同的,没有办法比 O(n^2) 做得更好,因为您需要显式生成 O(n^2) 对。如果你知道你在用这些对做什么(也许你正试图找到一个具有某些属性的对?)你也许可以利用问题的结构来加快速度,但是仅仅列出对必须花费 O (n^2) 时间。
  • 嗯,是的,我就是这么想的。我的面试问题是在一个数组中找到所有 3 个加起来为 0 的数字,我从一个 n^3 解决方案开始,然后是一个 ^2 log-n 优化,其中 logn 是一个搜索操作,然后是一个排序操作在名单上。我只是想知道是否有任何可能的方法来无限制地优化配对操作,这引发了巨大的讨论:)
  • @kosh 这么多年了,你有什么办法可以降低这种情况的复杂性吗?
【解决方案2】:

它仍然是 O(n^2),因为现在您拥有在引入订单要求之前的 一半 对。除以二不会改变大 O。

【讨论】:

    【解决方案3】:

    请记住,大 O 表示法涉及隐含的乘法常数。因此,如果您的运行时间是 infinity,那么您的复杂性仍然是 O(n^2)。

    【讨论】:

      猜你喜欢
      • 2011-12-10
      • 2022-11-10
      • 1970-01-01
      • 2014-03-23
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      相关资源
      最近更新 更多