如何在给定的迭代次数和总时间内找到算法的时间复杂度?

时间:2012-10-13 22:41:02

标签: performance algorithm time complexity-theory

我知道如何在我提出算法时找到算法的时间复杂度,但是当我被赋予了多少次时,我似乎无法理解如何解决它执行算法,并花费时间。

我有时可以得到它,当它显然是O(n),O(n)或O(n ^ 2)之类的东西时,请以此问题为例:

算法运行大小为n的给定输入。 如果n为4096,则运行时间为512毫秒。 如果n是16384,则运行时间是1024毫秒。 如果n是36864,则运行时间是1536毫秒。

时间复杂度是多少?

我认为这是n * 2,t * 1.5,但我不太清楚如何解决这个问题。

感谢您的帮助:)

3 个答案:

答案 0 :(得分:2)

我想说,由于系统的复杂性而不仅仅是算法,你需要的不仅仅是这类问题的三个数据点。

我要做的是比较迭代次数和经过的时间,看看是否能找到符合标准时间复杂度的模式:

  • 常数:O(c)其中c是常数。
  • 线性:O(n)
  • 多项式:O(n ^ c)其中c是常数(甚至像O(n ^ 2 + n ^ 6)那样复杂的东西)
  • 指数:O(c ^ n)其中c是常数。
  • 对数:O(log | n |)
  • 无论如何称呼:O(n log | n |)

让我们解决你的问题:

n     | time
4096  | 512 ms
16384 | 1024 ms
36864 | 1536 ms

当n上升4倍(从4096到16384)时,时间上升2倍(从512到1024毫秒)。

当n上升9倍(从4096到36864)时,时间上升了3倍(从512到1536毫秒)。

与此匹配的函数是f(n)= n ^(1/2)。当n上升4倍时,f(n)上升了sqrt(4)因子等...

所以这是O(n ^ .5)的阶数,它是多项式

TLDR:将其绘制出来并将其与时间复杂度的通用函数相匹配。在现实世界中,您可能需要三个以上的数据点。

编辑:我想补充一点,这应该更复杂。在各种时间复杂性中可能存在一个恒定的术语。即O(n ^ c)更可能是O(n ^ c + K),其中K是常数。在写出来时我们会忽略常量以简化,但它会显示在图表中。

答案 1 :(得分:0)

如果您不确定实际的算法,那么您会创建一个折线图,n将位于图表的底部,y将是该数字所用的时间执行。

如果线的斜率为0,那么它是O(1),如果它是线性的,那么它是O(n),如果它是弯曲的,那么它是O(n ^ 2),O(log n),或其他一些非线性时间复杂度。

答案 2 :(得分:0)

如果算法的时间复杂度为n^x,那么输入t_2 / t_1n_1的时间的商n_2

(t_2 / t_1) = (n_2 / n_1)^x

如果你采用对数,你得到

log (t_2 / t_1) = x * log (n_2 / n_1)

可以解决x

x = log (t_2 / t_1) / log (n_2 / n_1)

在您的示例中,使用n_1 = 4096t_1 = 512ms,您会获得商数

16384 / 4096 = 4        36864 / 4096 = 9
 1024 / 512  = 2         1536 / 512  = 3

所以x = 1/2

如果复杂性不遵循纯粹的幂律,则可以通过评估足够大量的此类商来估算功效。如果复杂性实际上是指数(或超指数),则商将线性增长或超线性增长。然后可以使用增长率来找到指数情况下指数的基数。