【问题标题】:Complexity - input length复杂性 - 输入长度
【发布时间】:2016-04-05 15:19:05
【问题描述】:

我目前正在学习复杂性(或效率,不管你怎么称呼它),我在我得到的一本书中读到了它。 写了一些我觉得很无意义的东西,我需要一个解释。我已经尝试在网上查找,但我没有找到他们给出的这个特定示例的答案。

对于在大小为n 的一维数组中获取最大数的算法,输入长度为n

“对于在二维数组中获取最大数的算法,n*n 的大小输入长度仍为n。”

我不明白为什么在这两种情况下输入长度都是'n',即使对于二维你必须通过n*n 数字... 它说

输入长度 = 完成的工作量 ...

对我来说没有任何意义。 有人愿意解释一下吗?他们当然不会在那里解释。

【问题讨论】:

  • 他们如何定义input length?根据您问题中的书准确地写下定义。
  • @Am_I_Helpful 确实,我已经写过了。 “输入长度是表示算法工作量的度量” - 粗略翻译自希伯来语......我没有用英语学习这个材料。
  • 那么,书中的工作量是如何定义的呢?是被视为输入的元素数量,还是计算该数组中最大元素的复杂度?
  • @Am_I_Helpful 工作量是计算机执行的操作数。例如:“if (h
  • 也许这对你有帮助 ---> cs.cmu.edu/~avrim/451f11/lectures/lect0908.pdf 。我觉得他们假设二维数组的元素总数为n,否则不可能以 O(n) 复杂度完成。不过我可能错了。

标签: algorithm time-complexity complexity-theory


【解决方案1】:

这是一个常见的误解(在 SO 上很常见),扫描具有 n*n 元素的二维数组的复杂性是 O(n^2)。不是,是O(n)。扫描是一种线性操作,一个元素接一个元素。

二维数组纯属客套话,实际上只是为了方便访问一维数组。毕竟,在正确实现数组的语言中(即没有一个指向内存块的指针数组),二维数组只是一组相邻的内存位置。即使在将二维数组实现为指针数组的语言中,它们也只是带有中断的线性内存段

如果对二维数组的扫描是O(n^2),那么您可以通过忽略二维并仅扫描底层的一维内存块来神奇地将其转换为O(n)

O(n^2) 描述了一种不同的复杂度级别的操作,例如对输入中的每对元素进行操作的操作。

【讨论】:

  • 如果您将nxn 矩阵的大小定义为n,那么扫描所有元素确实是O(n^2)。然而,这样的定义并不是非常有用,nxn 矩阵的大小最好定义为n^2,因为您已经给出了原因。
  • 你说的很有道理,如果这本书没有使用相同的变量。不过,本书使用了与一维数组和二维数组相同的n。据我了解,如果n = 2 则 4 次操作和 2 次操作的输入长度是相同的。 - 只是它没有意义。 除非他们不是指实际相同的n,而是使用相同的字母..?
  • @YuvalRoth 我认为您可以放心地认为本书使用相同的变量名是错误的。这仍然是正确的,但它使人们更难理解他们想说什么。
  • @biziclop 只是为了确保我理解。你可以说O(n^2) == O(n),因为它们都是线性的?
  • @YuvalRoth 是的,一个 2x2 数组的输入长度是 4。至少这是看待它的标准(和明智)方式,
【解决方案2】:

在 cmets 中读到这本书是用希伯来语写的,我认为问题是翻译错误或其他校对错误。输入长度的 cmets 中给出的定义“输入长度是表示算法工作量的度量”与您认为该术语在英语中的含义完全不匹配。

为了回答有关复杂性的问题,他们在多个地方重用了变量“n”,这使得它有点混乱。他们使用'n'来描述数组的维度和复杂度。 O(n) 仅仅意味着复杂度与输入成线性关系。 O(n^2) 将是指数复杂度。在这种具有 n*n 元素数组的情况下,输入是 n*n 或 n^2,但算法的复杂度仍然是 O(n)(或线性)。这是因为算法仍然只对每个输入元素操作一次,无论输入是 n 还是 n*n。如果每个元素操作一个 2 或 3 次,它仍然是线性的,因为 3n 和 n 都是线性函数(任何 x*n 都是线性的)。

我希望这会有所帮助。

【讨论】:

  • ...O(n^2) would be an exponential complexity... ---> 不,不会的!
  • 是的,指数更像 O(c^n)
【解决方案3】:

Big-O 表示法用于对算法的类型(复杂性类)进行分类,不一定要实际运行多少时间。例如 O(cn) 只是 O(n) 其中 c 是一个常数。

n 是输入的大小,无论该输入是 nxn 矩阵还是只是一个“n”长度的数组。 big-O 'n' 和程序变量名指的不是同一个东西。

【讨论】:

  • 我还应该指出@High Performance Mark 是正确的。我发帖只是为了澄清一件似乎有些混乱的小事。
猜你喜欢
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 2014-05-21
  • 1970-01-01
  • 2019-08-26
  • 1970-01-01
相关资源
最近更新 更多