【问题标题】:Time Complexity Calculation时间复杂度计算
【发布时间】:2016-02-01 08:08:49
【问题描述】:

我目前正在处理一些考试问题,但此时卡住了。我知道快速排序算法的时间复杂度为O(nlog(n))。对于特定的输入大小,排序列表的时间是 4 分钟。问题继续询问在同一系统上对两倍大小的列表进行排序需要多长时间。

我已经排除了时间不是8分钟(输入大小的两倍=持续时间的两倍,非常非常错误的推理)。

我做了一些工作:

工作A

  • 4 = nlog(n)
  • 4 = log(n^n)
  • 16 = n^n
  • 我基本上被困在这一点上。

工作乙

  • X = 2nlog(2n) >> 2n 因为输入加倍
  • X = 2n(1 + log(n))
  • X = 2n + 2nlog(n) >> nlog(n)4 分钟
  • X = 2n + 2(4) = 2n + 8
  • 我又一次陷入了困境。

【问题讨论】:

  • 其实快速排序是 O(n^2) 名字只是混淆
  • @Pooya 考试题中给出了时间复杂度,我无法控制。但是,给定的时间复杂度对于最佳情况或平均情况方案是正确的。您引用的时间复杂度 O(n^2) 是针对最坏情况的。
  • 我的意思是,如果你在每一步中选择你的关键元素作为元素的中位数,你可以证明最坏情况的运行时间实际上是在O(n*log(n)) .参见例如en.wikipedia.org/wiki/Quicksort#Selection-based_pivoting。你能说出确切的问题文本吗?这似乎与这里有关。
  • 我明白了 :) 是多选吗?
  • 我认为对于这个问题,你的考试的校正者必须接受几乎所有提供的解决方案,因为这个问题的格式不是很好。只是朗道符号给出的最坏情况复杂度,甚至不知道实际系数 - 实际复杂度可能类似于 4*nlog(n) - sqrt(2*n) + 100000*n ...所以你可能要做的就是“假设”实际的复杂性实际上是函数 nlog(n)(甚至是 n*ld(n),这似乎更合理;-))

标签: algorithm math time-complexity


【解决方案1】:

我认为关于这个问题首先要注意的是,考虑到排序数字需要 4 分钟,n 一定很大。例如,我刚刚使用快速排序在我的计算机上对十亿个数字进行排序,只用了不到 3 分钟。所以n 大概是 10 亿(上下一个数量级)。

鉴于n 很大,对于某个常数c,将此运行时近似为c*n*lg(n) 可能是合理的,因为运行时扩展的低阶项对于如此大的n。如果我们将 n 加倍,我们会得到以下运行时间与原始运行时间相比的乘数:

[Runtime(2n)] / [Runtime(n)]
[c * (2n) * lg(2n)] / [c * n * lg(n)]
2 * lg(2n) / lg(n)
2 * log_n(2n)
2 * (1 + log_n(2))

这里,lg() 是任意底下的对数,log_n() 是对数底 n

首先,由于我们假设 n 很大,一种可能的方法是将 log_n(2) 近似为 0,因此运行时间乘数将近似为 2,总运行时间近似为 8 分钟。

另外,由于我们可能知道n 在一个数量级之内,另一种可能性是近似乘数以获得n 的可能值:

  • 如果n = 1 亿,那么我们会将乘数近似为 2.075,总运行时间为 8.30 分钟。
  • 如果n = 10 亿,那么我们会将乘数近似为 2.067,总运行时间为 8.27 分钟。
  • 如果n = 100 亿,那么我们会将乘数近似为 2.060,总运行时间为 8.24 分钟。

请注意,我们对 n 的近似值的巨大变化会导致总运行时间的近似值发生非常小的变化。

值得注意的是,虽然这在纸面上看起来不错,但在实践中,架构方面的考虑可能会导致实际运行时与我们在此处计算的运行时大不相同。例如,如果算法在数据大小翻倍后引发大量分页,则运行时间可能会比我们在这里估计的大约 8 分钟要长得多。

【讨论】:

  • 这很好解释!非常感谢您的帮助!这个问题应该更多地在逻辑上而不是在数学上解决,你完美地平衡了我们。
  • 请注意,这个问题甚至没有假设算法在标准 PC 系统上运行,它也可能是一个低功耗的嵌入式设备,在 4 分钟内几乎不能对一千个项目进行分类。
  • @liori 当然,在这种情况下,估计将是 8.80 分钟,不会比十亿项的估计高出很多。
【解决方案2】:

在不知道n的值的情况下,无法计算绝对时间。
通过一些经验值来了解这一点。
假设“k”是一次操作所花费的时间

If, n = 2, k.n.log(n) = 4   => k.2.1 = 4   => k = 2
  if n is doubled, k.2n.log(2n) = 2.4.2 => 16 minutes

If, n = 4, k.n.log(n) = 4   => k.4.2 = 4   => k = 1/2
  if n is doubled, k.2n.log(2n) = 1/2.8.3 => 12 minutes

If, n = 64, k.n.log(n) = 4   => k.64.6 = 4   => k = 1/96
  if n is doubled, k.2n.log(2n) = 1/96.128.7 => 9.33 minutes

所以随着 n 的增加,所用时间接近两倍(8 分钟)

【讨论】:

  • 这很有帮助!但是,没有给出输入大小,并且考官需要一个“近似值”——这是一个相当模棱两可的问题
【解决方案3】:

所提供的信息不完整

证明:

设算法复杂度为O(nlogn)。这意味着花费的时间,t = c*nlogn

因此,我们有以下等式:

  • 4 = c*n*logn
  • t = c*(n2)*log(n2),其中t 是必填答案
  • n2 = 2*n2

变量数 = 4(nn2tc
唯一方程数 = 3
由于我们需要 4 个变量的至少 4 个方程,因此提供的信息不完整。

【讨论】:

  • 确实如此!很惊讶这是如何进入考试的。请问为什么要引入'c'?我们从未真正解决过此类问题,我们只是解释了时间复杂度是什么以及它如何从一种算法到另一种算法。
  • 这就是 Big-O 复杂度的定义方式。如果一个算法是 O(f(n)),这意味着所花费的时间与f(n) 成线性比例。你可以阅读更多关于它的信息here
  • 只是一个旁注:(确切的!)复杂度不必是 cnlog(n)。 O(nlog(n)) 只是说存在 c > 0 和 n > 0(可能非常大),其实际复杂度 t(n) n*log(n )。甚至可能 t(8) 小于 t(4),只要上面的条件最终成立。
  • 为大家的帮助干杯!
【解决方案4】:

这听起来像是一个非常糟糕的考试问题,可能是由对 Big-O 表示法的实际含义没有深入了解的人编写的。它有很多问题 - 其中大部分已经在其他答案中得到解决。

最大的问题是 Big-O 表示法没有给你任何与实时的直接关系。它抛出了回答实际问题所需的大量信息。

此处的其他答案指出,该问题并未向您说明原始输入集中有多少项目,只是第二集中有两倍多,并且该信息对于给出答案。但是有几件事他们没有提到......

首先,Big-O 忽略了算法开销。可能的情况是,无论它接收多少输入,所使用的算法实际上需要 3.5 分钟来设置,而对于原始输入集,实际处理时间仅为大约 30 秒。这将严重影响任意数量的输入所用时间的计算。

但尽管这个遗漏很糟糕,但 Big-O 更进一步。

看看Wikipedia的这句话:

在典型用法中,不直接使用 O 符号的正式定义;相反,函数 f 的 O 表示法是通过以下简化规则推导出来的:

  • 如果 f(x) 是多项的总和,则保留增长率最大的一项,并省略所有其他项。
  • 如果 f(x) 是多个因子的乘积,则省略任何常数(乘积中不依赖于 x 的项)。

这意味着时间计算可以包括最终被丢弃的多个术语。如果算法需要c * (n + n * log(n)) 时间来完成,而没有开销怎么办?在 Big-O 表示法中,它仍然是 O(nlogn)

对于考试问题,唯一可能的答案是“超过 4 分钟的时间”。如果没有更多信息,我们无法知道更多。具体来说:

  • 开销是多少?
  • 每次操作的时间成本是多少?
  • 我们在谈论多少个项目?
  • 还省略了哪些其他术语?

【讨论】:

  • 没错,这个问题相当缺乏。不幸的是,这些考试是进入大学所必需的,对全国考试的低标准感到非常惊讶。感谢您抽出宝贵时间回答。
【解决方案5】:

我喜欢@Amitoj 的推理,但我想概括一下。

n0 = 导致运行时间为 4 分钟的元素数,n1 = 2 * n0。然后我们有

c = 4 mins / (n0 * log n0)

我们正在寻找

t = c * n1 * log n1
  = 4 mins / (n0 * log n0) * n1 * log n1
  = 4 mins * (n1 / n0) * (log n1 / log n0)

n1 / n0 总是 = 2。

由于 n0 => 无穷大,log n1 / log n0 的极限变为 1。

所以是的,随着 n0 变大,t 的极限是4 mins * 2 = 8 mins

【讨论】:

    【解决方案6】:

    除了Anmol Singh Jaggi之外的所有答案都是错误的。

    首先很容易看出这些信息不足以得到答案。这就是为什么:

    你需要做的就是解一个方程。如果你的算法的时间复杂度是 O(n logn),那么你的第一个方程是:

    n 在您的列表大小中。如果他们想让你知道你完成两倍大的算法需要多少时间,他们基本上是想找到x

    所以基本上你需要求解一个由 2 个方程组成的系统,其中有 3 个未知数。这有 0 个答案(在我们的例子中不是)或无限数量的答案。


    现在你必须假设你的 c1。如果c1 = 1,那么

    将 n 代入得到的第二个等式:x = 13.5。所以 13 分半钟。


    但是再一次,这个答案我们假设 c1 等于 1,如果你有另一个常数因子,你会得到另一个答案。

    【讨论】:

    • 挑战是在心理上解决它...考试不允许使用任何类型的计算器...!计算 n 的值会相当困难。
    • @XandruMifsud 好的,如果您认为提供错误的值(绝对错误的解决方案)是一个更好的选择,那么请继续您接受的解决方案。在考试中,足以说明您无法回答 3 未知系统的 2 方程。另一方面,您在考试中不需要 5 位数的精度。很容易看出nlogn = 4 的解决方案介于2.53 之间(这可以在2 分钟内完成)。所以选择 2.75 作为中间值。计算5.5 log 5.5 并不难。所以不需要任何类型的计算器,你可以在你的脑海里做这个
    猜你喜欢
    • 2021-03-03
    • 1970-01-01
    • 2011-06-21
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多