Performance 当给定迭代次数和总时间时,如何计算算法的时间复杂度?

Performance 当给定迭代次数和总时间时,如何计算算法的时间复杂度?,performance,algorithm,time,complexity-theory,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,但我不太确定如何计算 感谢您的帮助:)如果您不确定实际的算法,那么

当我被介绍一个算法时,我知道如何找到算法的时间复杂度,但当我被告知算法执行的次数和所用的时间时,我似乎无法理解如何计算出来

有时我可以得到它,当它是很明显的事情,比如O(n),O(n)或O(n^2),但以这个问题为例:

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

时间复杂度是多少

我认为是n*2,t*1.5,但我不太确定如何计算


感谢您的帮助:)

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


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

如果算法的时间复杂度是
n^x
,然后输入时间
n_1
n_2
的商
t_2/t_1

(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=4096
t_1=512ms
,可以得到商

16384 / 4096 = 4        36864 / 4096 = 9
 1024 / 512  = 2         1536 / 512  = 3
所以
x=1/2


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

我想说,对于这类问题,您需要的不仅仅是三个数据点,因为系统中的复杂性,而不仅仅是算法

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

  • 常数:O(c),其中c是常数
  • 线性:O(n)
  • 多项式:O(n^c),其中c是常数(甚至是像O(n^2+n^6)这样复杂的东西)
  • 指数:O(c^n),其中c是常数
  • 对数:O(对数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是常数。为了简单起见,我们在写这篇文章时忽略了常数,但它会出现在你的图表中。

一般来说,这是不可能回答的。你的教授可能想让你将一个常见的时间复杂度与给定的值相匹配,但你所知道的算法可能是O(1)。此外,有些算法有不同的情况。一个例子是SAT解算器,它通常非常快,但在最坏的情况下会衰减到指数级的运行时间(这对于
n
的大值来说非常糟糕)太棒了,我现在明白了!谢谢大家的帮助:)