【问题标题】:algorithms average case time complexity算法平均案例时间复杂度
【发布时间】:2017-01-23 23:57:00
【问题描述】:

如果一个算法的平均案例时间复杂度为 O(n2 ),对于 1000 个元素的输入大小需要 10 秒来执行,那么当输入大小为 10,000 个元素时,它需要运行多长时间?

【问题讨论】:

  • 我们通常不会将大 O 与确切时间联系起来,但您仍然可以说大约需要 10^5 秒(虽然这样做不正确) time= a.n^2 find a by first约束。同样,这不是一个正确的方法,因为大 O 与精确时间不同,但它仍然给出了粗略的估计
  • O(n^2) 可以是像 1000000 + 0.0001(n^2) 这样的函数。所以理论上你不能仅仅通过复杂性的顺序来预测时间。大 O 复杂度只是衡量时间如何随着 N(输入大小)趋于无穷大而渐近增长的量度。
  • 即使你知道平均时间正好是 c.n^2 你仍然无法回答这个问题,尽管你可以说出最大似然估计量是多少。
  • 我投票决定将此问题作为题外话结束,因为该问题包含错误的假设,这使得解决方案变得不可能。

标签: java algorithm time-complexity


【解决方案1】:

无法回答.. 任何真正给出数字的人都是错误的。因为时间复杂度与底层机器架构独立。这就是我们忽略机器相关常量的原因。

每个平台在执行某些操作时都有自己的开销。所以,再一次,答案是不可能说

【讨论】:

  • “因为时间复杂度与底层机器架构无关”不能证明前面的说法是正确的。 O(n^2) 并不意味着 cn^2,但如果确实如此(CS 中的许多人错误假设或滥用符号的方式),那么我们可以根据给定的一个数据点确定该机器的 c。它不是永久不可知的,在实践中我们也不应该忽视它。
  • @DouglasZare - 在这种情况下,我们不应该尝试根据时间复杂度来查找实际执行时间。只需说出所花费的时间。因为将 时间复杂度增长顺序 与实际 运行时间 联系起来就像问 - 狮子通常每天睡 20 个小时。告诉我狮子亚历克斯每天睡多长时间
  • 问题说输入大小为 1000 的实际时间是 10 秒。这并不是说我们需要单独从 O(n^2) 到输入的实际时间大小 10,000。
  • @DouglasZare - 那么请告诉我.. 10000 输入大小需要多长时间?
  • 如果假设第一个数据点具有代表性并且运行时间不只是 O(n^2) 而是 cn^2,那么将输入大小增加 10 倍会增加运行时间时间乘以 100 倍,从 10 秒到 1000 秒。这不是保证,但在许多情况下这是一个合理的估计。
【解决方案2】:

虽然无法给出适用于所有机器的特定数字,但您可以估计O(n^2) 应该是 100 倍左右,n 增加 10 倍

这有两个重要的条件

  • 所花费的时间可能比这要少得多,因为第一次测试可能包括大量的热身。也就是说,您可能会发现它只需要两倍的时间。这将是令人惊讶的,但这是可能的。在 Java 中,温暖是短测试中的一个重要因素,如果再次运行 10K 的测试所需的时间要少得多,这种情况并不少见。事实上,多次运行 10K 的测试可能会开始显示比运行一次 1K 更快的时间(并且 JIT 会发挥作用,尤其是如果代码很容易优化)
  • 所花费的时间可能要长得多,尤其是在达到某个资源阈值的情况下。例如比如说 1000 个元素适合缓存,但 10000 个元素适合主内存。类似地,1000 可以放在内存中,但 10000 必须从磁盘中分页。这可能会导致花费更长的时间。

【讨论】:

  • 嗨,彼得,请解释一下?根据上面给出的时间,还要多长时间?
  • @IsayasNega 当您访问 L3 CPU 缓存中的数据时,每次访问可能需要 10 ns,但是如果您访问主内存中的数据,则可能需要 70 ns。这意味着数据不再适合您的 L3 缓存(因为它更大)这一事实意味着它的访问速度要慢 7 倍。如果有 100 倍的访问次数,这会慢 700 倍。
  • @IsayasNega 同样访问数据主内存可能需要 70 ns,但访问磁盘可能需要 70,000,000 ns。因此,如果数据不再适合主内存,因为它大了 10 倍,那么每次访问都会慢 10^6 倍。如果访问次数是 100 倍,则程序可能需要 10^8 倍的时间。
猜你喜欢
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多