如何通过示例计算给定算法的O(n,x)?

时间:2012-11-25 17:30:55

标签: python algorithm computer-science asymptotic-complexity

我想计算给定算法的运行时间O(n,x)= Theta(n,x),取决于n和x大量(> 100)的例子(算法需要多长时间)对于n和x)。 有没有办法做到这一点?

我知道运行时间随着n和x(!)的增加而增加,但我认为相干性过于复杂,无法通过“手”找出O(n,x),因为n或x mac增加如n ^ x,甚至更糟。

顺便说一句。我最喜欢的解决这个问题的语言是Python或PHP。

2 个答案:

答案 0 :(得分:2)

有一个名为Eureqa的免费工具可能会让您感兴趣。您可以为其提供数据,它会找到适合您数据的候选方程式。例如,您在不同的输入大小上运行算法并记录每个算法的执行时间,然后向Eureqa提供此数据。然后它会为您提供适合您数据的数学方程式。

许多算法的运行时间高度依赖于输入数据中的特定值。因此,这并不总是一个很好的方法来进行渐近分析,因为你只是不知道你的数据是否正在将算法推向它的边界。

但是,我们使用渐近分析作为达到目的的手段 - 我们经常想要选择一种算法可能在真实世界中对现实世界数据有效。而且,这就像基准测试一样,但是你可以获得更好的额外数学洞察力。另外,请记住,渐近分析本身就是一种让步,我们需要简化和降低我们的期望,以便得到一些简单到有用的答案。

观看他们的youtube vid http://www.youtube.com/watch?v=NhC1Qb-PQ5Q

答案 1 :(得分:1)

最好的方法是仔细查看算法并分析每个步骤以计算平均和最差情况的运行时类。

如果这不可行,您可以使用相对较小的数字运行算法,并将它们相互比较。如果运行时按任何参数的顺序呈指数运算,即使差异为10或20,它也应该是显而易见的。只需绘制运行时间,比如说

  • x = 10且y在范围(50)
  • y = 10且x在范围(50)
  • 范围(50)中的x,y = x

应该给你一个粗略的想法。当运行时变长时,您可以提前中止,例如大于(1,1)的运行时的10000倍。

这应该给你一个粗略的估计,但是你应该清楚地知道它既不精确(你的测试数据可能无意中遵循某些模式并且达到了好的情况)也不够(所涉及的因素可能非常小 - 你赢了'正确识别,例如x + 0.0001 * 1.05^y)。幸运的是,在许多情况下,指数算法的基数明显大于1。

在Python中,您可以使用timeit模块来正确测量运行时。