某些算法A的计算复杂度为O(n * sqrt(n))。执行基本操作所需的时间是1毫秒。 1s内可以解决的最大输入大小是多少?如果我们使用速度提高1000倍的计算机,最大输入量会增加多少倍?解释你的答案。
我在算法的书中遇到了这个问题,它应该是一个理论问题,但我找不到书中的材料来帮助解决这个问题。任何人都可以提供解释或提示。
我不想编辑原始问题,但使用Big-ThetaӨ(n * sqrt(n))而不是Big-O会更有意义吗?
答案 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)
但问题可能是一个棘手的问题,所以做出这个假设是错误的。尝试使用n
和g(n)
来解决h(n)
,您会得到截然不同的答案。