输入中可以在1s内解决的最大尺寸m是多少?

时间:2017-02-10 07:35:24

标签: algorithm big-o

某些算法A的计算复杂度为O(n * sqrt(n))。执行基本操作所需的时间是1毫秒。 1s内可以解决的最大输入大小是多少?如果我们使用速度提高1000倍的计算机,最大输入量会增加多少倍?解释你的答案。

我在算法的书中遇到了这个问题,它应该是一个理论问题,但我找不到书中的材料来帮助解决这个问题。任何人都可以提供解释或提示。

我不想编辑原始问题,但使用Big-ThetaӨ(n * sqrt(n))而不是Big-O会更有意义吗?

3 个答案:

答案 0 :(得分:3)

问题在于两个方面是假的:

  • 渐近复杂性具有隐含的乘法常数,这是未知的。说"时间是O(N) - >是错误的。执行N次操作";

  • O(N)只是一个上限,保证一些C的时间不会超过C.N.但事实上它并没有告诉你实际的运行时间!

现在让问题更具可解性,我们假设

  • 运行时间正好是C.N√N,

  • C = 1 ms。

当N = 100时,N√N= 1000,当N = 10000时,N√N= 1000000。

答案 1 :(得分:2)

如果算法有

O(n*sqrt(n))

时间复杂,实际上意味着执行时间是

T(n) = C*n*sqrt(n) + o(n*sqrt(n)) 

C有些不变。例如,T(n)可能是

T(n) = 1000 * n * sqrt(n) + 1e10 * n + 200 * sqrt(n) + 15 * log(n) + 1e20

当然,上面的公式是夸大其词,但是,你看到了 问题:O(f(n))不是执行时间本身,而只是渐近。要近似执行时间,您必须进行实验,例如如果我们有

   n | T(n), ms
 --------------
   1 |       12
   3 |       20
  10 |       73
  30 |      339
 100 |     2010

我们可以在最小二乘算法的帮助下近似T(n)

 T(n) = 2 * n * sqrt(n) + 10 

拥有公式时,您可以为n求解。在上面的例子中

   2 * n * sqrt(n) + 10 = 1000

我们可以找到

   n = 495**(2/3) = 63   

作为问题的最大大小,可以在1000毫秒内解决。

当只有O(f(n))时,你不能(在一般情况下)说出如果你有一台更快的计算机会在执行时间内发生什么,但很明显& #34;它不会变得更糟糕#34;让我们回到我们夸大的公式:

T(n) = 1000 * n * sqrt(n) + 1e10 * n + 200 * sqrt(n) + 15 * log(n) + 1e20

正如您所看到的,在真实世界中,它是最后一项 - 1e20 ,它支配所有合理的输入,这就是为什么答案将会是"工作站速度提高1000倍 nothing "。相反:

T(n) = 1e-1000 * n * sqrt(n) + log(n)

具有O(n*sqrt(n))复杂性,log(n)项主导合理(即足够小n s; 1000次CPU性能提升将导致算法性能提高2**1000 == 1e300

答案 2 :(得分:1)

在这里使用Big-Oh表示法是错误的。你不知道每n有多少基本操作,因为Big-Oh会丢弃所有常数因子和所有低阶项。这些函数都在O(n*sqrt(n))

f(n) = n * sqrt(n)
g(n) = 4711 * n * sqrt(n)
h(n) = n * sqrt(n) + 18 650 000 000

如果我们假设它们意味着第一个函数(一个错误的假设),那么你的第一个问题只不过是解决n的简单代数表达式:

1000 = f(n) = n * sqrt(n)

但问题可能是一个棘手的问题,所以做出这个假设是错误的。尝试使用ng(n)来解决h(n),您会得到截然不同的答案。