我知道如何在我提出算法时找到算法的时间复杂度,但是当我被赋予了多少次时,我似乎无法理解如何解决它执行算法,并花费时间。
我有时可以得到它,当它显然是O(n),O(n)或O(n ^ 2)之类的东西时,请以此问题为例:
算法运行大小为n的给定输入。 如果n为4096,则运行时间为512毫秒。 如果n是16384,则运行时间是1024毫秒。 如果n是36864,则运行时间是1536毫秒。
时间复杂度是多少?
我认为这是n * 2,t * 1.5,但我不太清楚如何解决这个问题。
感谢您的帮助:)
答案 0 :(得分:2)
我想说,由于系统的复杂性而不仅仅是算法,你需要的不仅仅是这类问题的三个数据点。
我要做的是比较迭代次数和经过的时间,看看是否能找到符合标准时间复杂度的模式:
让我们解决你的问题:
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_1
和n_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 = 4096
和t_1 = 512ms
,您会获得商数
16384 / 4096 = 4 36864 / 4096 = 9
1024 / 512 = 2 1536 / 512 = 3
所以x = 1/2
。
如果复杂性不遵循纯粹的幂律,则可以通过评估足够大量的此类商来估算功效。如果复杂性实际上是指数(或超指数),则商将线性增长或超线性增长。然后可以使用增长率来找到指数情况下指数的基数。