Performance 当给定迭代次数和总时间时,如何计算算法的时间复杂度?
当我被介绍一个算法时,我知道如何找到算法的时间复杂度,但当我被告知算法执行的次数和所用的时间时,我似乎无法理解如何计算出来 有时我可以得到它,当它是很明显的事情,比如O(n),O(n)或O(n^2),但以这个问题为例: 算法运行大小为n的给定输入。 如果n为4096,则运行时间为512毫秒。 如果n为16384,则运行时间为1024毫秒。 如果n为36864,则运行时间为1536毫秒 时间复杂度是多少 我认为是n*2,t*1.5,但我不太确定如何计算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,但我不太确定如何计算 感谢您的帮助:)如果您不确定实际的算法,那么
感谢您的帮助:)如果您不确定实际的算法,那么您将创建一个折线图,
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
的大值来说非常糟糕)太棒了,我现在明白了!谢谢大家的帮助:)