公式如何从这些代码行中派生出来?

时间:2012-01-22 02:38:12

标签: java algorithm math formula time-complexity

我正在阅读以下一本书 - http://www.amazon.com/Algorithms-4th-Robert-Sedgewick/dp/032157351X,其中一个部分讨论了从代码中推导出公式来估计性能。

例如,线D的公式是“N 3 / 6-N 2 / 2 + N / 3”。 我可以看到三个“N”代表三个for循环。并且如何得出立方和平方。但为什么“N 3 / 6”和为什么减法再添加?

Performance Calculation

感谢。

4 个答案:

答案 0 :(得分:3)

我们只关注i&lt; j&lt; k,这不是所有N ^ 3种可能性。 0 <= i <0的可能性的数量。 j&lt; k&lt; N是N选择3,等于N ^ 3/6 - N ^ 2/2 + N / 3.

答案 1 :(得分:3)

有时候使数字具体化是有帮助的,并且通过整个程序追踪很长的路径(就像它一样)将具体的数字放在你感到困惑的每个数量上。

所以在这种情况下,如果N是(任意)10,那会发生什么?

好吧,对于A块,没关系:执行一次。

对于B块,它确实很重要:我从0开始,并执行直到并包括i = 9,总共执行10次,但N是10。

对于C块,它变得更加棘手:当i为0时,j初始化为1,并执行直到并包括j = 9,总共执行9次。然后下一次通过,i = 1,j初始化为2,并执行8次等。总计,它执行9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 = 45次。但那是(N ^ 2-N)/ 2。

D和E块遵循相同的方式。

那就是说,你不应该费力地通过每一个例子,就像那样。我上面的两个答案是完全正确的,非常简洁。对于像这样的小环,我通常会考虑几何:B块就像在标尺上标出凹口,这是测量长度。 C块就像在网格上标出正方形,首先是9行,然后是8行等等。它有点像测量区域,在这种情况下,该区域看起来像一个三角形,其面积比例到N ^ 2。

如果我的几何类比对你不起作用,那没关系。做足够的这些,你希望得到一个直观的框架。

答案 2 :(得分:1)

因为j循环的循环限制是从i的当前值派生的,并且k循环的限制是从{{1}的当前值派生的}。如果你计算出所有数学,那就是你最终得到的表达式。

答案 3 :(得分:1)

您还可以通过求解以下求和来推导出行D 的频率:

enter image description here

应用列出here的适当公式(前两节)。