如何验证算法的运行时间?

时间:2017-03-25 01:36:42

标签: java algorithm performance

我使用仿射间隙成本编码了全局对齐算法。 big-O表示法的算法运行时间为O(n ^ 2)。然而,我班上的老师说,为了验证运行时间,必须将运行时间除以n ^ 2,其中n是序列的长度(使用不同长度enter image description here的序列)。如果(n,R(n)/ n ^ 2)低于水平线,则验证运行时间。我无法理解这意味着什么。我使用不同长度的序列绘制了R(n)/ n ^ 2。它奏效了。我在开始时有波动但随后波动消失了(你也可以在图像中看到这一点)。我使用的序列长1000个碱基至10,000个碱基。 某人R(n)/ n ^ 2如何验证运行时间?我试过在互联网上寻找但却找不到可能的答案。请原谅我,如果我的问题太简单了。我没有计算机科学背景。

5 个答案:

答案 0 :(得分:2)

如果我们说算法在O(n²)中,我们实际上是指运行算法所需的步骤数,因为输入大小n 的函数是O(n²)。

当我们说函数在O(n²)中时,我们实际上意味着存在一个正常数j > 0,因此c表示大输入大小n。

这相当于说:有一个正常数f(n) < c * n²,因此对于大输入大小n c

您已经注意到上面的图表会收敛到一个恒定值。这是您的c > f(n) / n²

当然,运行您使用的算法depend on the machine所需的步骤数。

答案 1 :(得分:2)

一些数学。 (对不起,但你需要一些数学才能真正理解这一点。)

符号f(n)O(n^2)表示:

  

1)定义g(n)= f(n)/ n 2

     

2)N趋于无穷大的极限g(n)为C,其中C为常数

直观地说,随着g(n)变得越来越大,C函数越来越接近n。一位数学家会说它会收敛&#34;到C

(实际上,数学比这复杂一点,但我非常生疏。而且我试图保持这一点。)

你的图表正在做什么来演示 g(n)确实收敛了。并且C值是Y轴上的值,它对应于图形接近的直线...因为X轴上的值变为无穷大。

答案 2 :(得分:1)

O n 2 )被定义为函数集 R n < / em>)这样,对于某些常量 c R n )≤ cn 2 所有足够大的 n

该不平等等同于 R n / n 2 < / SUP> C

因此,您的老师建议您绘制 R n / n 2 看到,对于足够大的 n ,你得到(大致)一个常数 c

请注意,此图不是正式证据。这只是一个有用的可视化。

答案 3 :(得分:1)

更简单地解释一下:O(n²)中的算法就像二次函数。您总是可以通过a *b²形式的函数对二次函数进行除法,以获得常数函数。

答案 4 :(得分:1)

运行时间为O(n ^ 2)意味着总会存在2个实数正数 b n0 ,这样,对于每个 n&gt; = n0

R(n)&lt; = b *(n ^ 2),其中R(n)是运行时间函数。

换句话说,运行时间保持低于b *(n ^ 2)形式的函数。

如果你采用不等式并将所有东西除以(n ^ 2),你得到:

R(n)/(n ^ 2)&lt; = b

并且Big O定义仍然适用。

因此只要R(n)/(n ^ 2) n> = n0 低于 b ,则R(n)为O(n ^ 2)。换句话说,这意味着保持低于常数函数 b (水平线)。

你正在做的是绘制R(n)/ n ^ 2并检查图表是否水平稳定,足够高 n

这比绘制R(n)更容易,并试图确定图形是否近似为二次函数(二次函数非常类似于立方和高阶多项式,你不同意吗?)。如果R(n)实际上是O(n ^ 3),R(n)/(n ^ 2)会给你一个新月函数,你可以在你的图中验证。