【问题标题】:Big O complexity of simple for not always linear?简单的大 O 复杂性并不总是线性的?
【发布时间】:2010-03-16 01:26:57
【问题描述】:

我相信大多数人都知道,如果函数输入大小为 n,嵌套循环的复杂度为 O(n^2)

for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
...
}
}

我认为这是相似的,通过类似的论点,但我不确定有人能证实吗?

for(int i = 0, max = n*n; i < max; i++{
...
}

如果是这样,我猜除了递归和子例程之外,还有一些代码的大 O 映射不是立即显而易见的。

【问题讨论】:

  • 什么是“简单的”?
  • 想象一下它做了一个求和,一个 O(1) 的常数运算。
  • “简单的“for”循环”,我猜。需要一个简单的定义。

标签: theory complexity-theory big-o


【解决方案1】:

您的基本简单循环总是 O(m),其中 m 是迭代的上限。但是你的 m 真的是 n*n,所以是 O(n^2)。

【讨论】:

  • 这里似乎有很多不和谐的地方。对于下面回复评论中给出的原因,我基本上会同意我的直觉,并将您标记为正确。
【解决方案2】:

如果 m = n^2,那么“simple for”在 m 中肯定是线性的。如果您想争辩说这是 n^2,请继续。

Big-O 符号在这里计算操作。如果您正在执行其中的 n^2 个,我不确定将总和报告为 n^2 会告诉您什么,因为您正在执行 m 个操作。

你的提议对我来说没有意义。这笔款项的真实名称具有误导性。正确的说法是 O(m)。

【讨论】:

  • 它将计数与原始嵌套循环函数(或任何其他假设 n 为基数的函数)进行比较。否则,如果我无法比较并知道要关注什么,为什么还要计算复杂性?
  • @i30817 算法分析是关于 n 变化的影响(在你的情况下是操作/时间,而不是空间)。随着 n 的增加,您的操作次数会随着 n^2 的增加而增加。在某些情况下,例如查找相对“简单”循环的上限与 n 相关的因素,例如 n^.5 或 log n,在这种情况下,效果相同。我不知道有任何简单的神奇方法来进行算法分析。
【解决方案3】:

取决于您所说的“简单”是什么意思。在大小为 n 的排序数组中除以二的搜索也可以写成非嵌套的 for 循环,但它需要 O(log(n)) 时间。就像你说的那样,从 0 到 n*n 的 for 循环将在 O(n*n) 时间内执行。

是的,有些代码的运行时间不是很明显。更重要的是,那里的代码效果甚至目的也不是立即显而易见的:)

【讨论】:

    【解决方案4】:

    它仍然是 O(n) - 除了在这种情况下你的“n”是“n*n”。您只是增加了 n 的值 - 而不是循环的复杂性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-17
      • 2014-03-07
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 2019-05-31
      • 2011-03-16
      相关资源
      最近更新 更多