时间复杂度计算

时间:2016-01-31 17:08:30

标签: algorithm math time-complexity

我目前正在做一些考试问题,并且此时陷入困境。我得知Quicksort算法的时间复杂度为O(nlog(n))。对于特定输入大小,对列表进行排序的时间为4分钟。问题继续询问在同一系统上对两倍大小的列表进行排序需要多长时间。

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

我做过一些工作:

工作A

  • 4 = nlog(n)
  • 4 = log(n^n)
  • 16 = n^n
  • 我基本上陷入了困境。

工作B

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

6 个答案:

答案 0 :(得分:6)

我认为关于这个问题首先要注意的是,鉴于对数字进行排序需要4分钟,n必须非常大。例如,我只是使用quicksort在我的计算机上排序十亿个数字,它花了不到3分钟。因此n可能大约为10亿(给予或采取一个数量级)。

鉴于n很大,因此对于某个常量c*n*lg(n),将此运行时近似为c可能是合理的,因为运行时扩展的低阶项不应该是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)很大,一种可能的方法是将n近似为0,因此运行时乘数将近似为2,总运行时间将近似为8分钟。

或者,由于我们可能知道n在一个数量级内,另一种可能性是近似乘数可能值为n

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

请注意,OnEditorActionListener近似值的巨大变化会使总运行时间的近似值发生微小的变化。

值得注意的是,虽然这在纸面上看起来不错,但在实践中,体系结构考虑可能会导致实际运行时间与我们在此处计算的运行时间大不相同。例如,如果算法在将数据大小加倍后引发一堆分页,则运行时间可能远远高于我们在此处近似的约8分钟。

答案 1 :(得分:5)

在不知道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分钟)

答案 2 :(得分:5)

提供的信息不完整

证明:

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

因此,我们有以下等式:

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

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

答案 3 :(得分:2)

这听起来像是一个绝对可怕的考试问题,可能是由一个对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分钟的时间。”没有更多的信息,我们不能知道更多的东西。具体做法是:

  • 什么是开销?
  • 每次操作的时间成本是多少?
  • 我们谈论了多少项?
  • 还有哪些其他条款被删除?

答案 4 :(得分:1)

我喜欢@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。

as n0 =>无穷大,log n1 / log n0的限制为1。

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

答案 5 :(得分:1)

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

首先,很容易看出这些信息不足以得到答案。这就是原因:

您需要做的就是解决一个等式。如果算法的时间复杂度为O(n logn),那么您得到的第一个等式是:

enter image description here

列表大小为n。如果他们希望您找到完成算法大小两倍的算法所需的时间,他们基本上想找到x

enter image description here

所以基本上你需要解决一个2个方程的系统,其中3个未知。这有0个答案(不是我们的情况)或无限量的答案。

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

enter image description here

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

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