自从我正在学习GRE以来,我一直在寻找有关此问题的解释:
对于大小为50的条目,算法会在10秒内运行。如果算法是二次方的,那么输入大小为100时,大约要花几秒钟在同一台计算机上?
我看不到时间和输入之间的关系。
考虑:O(n^2) -> O(50^2) =! 10 (seconds)
此外,我想研究更多有关此主题的内容,因此,请添加任何来源。
谢谢。
答案 0 :(得分:4)
请注意,该术语草率,时间复杂度没有时间概念(是的,名称在欺骗)。
由于我们在big-O框架下工作,忽略了小于 O ( n 2 )的项,因此可以表示二次函数
t = c * n 2
给出值(10,50)的(t,n)对
10 = c * 2500
c = 1/250 = 4/1000
求解(t,100)我们得到
t = 4/1000 * 10000 = 40
有一种更快,更深入的解决方案。
训练有素的眼睛可以立即将答案识别为40。
考虑此功能的功能:
t = c * n k
现在让我们考虑输入 m 0 和 m 1 ,其中 m 1 = a * m 0 是 m 0 。
让我们比较各个 t 0 , t 1 :
t 0 = c *( m 0 ) k
t 1 = c *( m 1 ) k = c * a k *( m 0 ) k
所以我们看到对于多项式时间函数 t 1 / t 0 = a k 或 t 1 = a k * t 0 。
两个输出之间的比率是它们的输入与第 k次次幂的比率。
对于二次函数 k = 2,因此两个输出之间的比率是两个输入之间的比率的平方。
如果输入加倍(比例= 2),则输出翻倍(比例= 2 2 = 4)。
如果输入三倍(比率= 3),则输出为 9 倍(比率= 3 2 = 9)。
一个好的记忆技巧是记住从输入比率到输出比率的函数与给定函数的种类相同。
我们得到了一个二次函数,所以它是输入和输出比率之间的一种关系:
input output
ratio ratio
1 1
2 4
3 9
4 16
5 25
... ...
该问题告诉您输出翻倍(从50到100个条目),所以输出必须翻两番(从10到40),因为函数是 quadratic 。
如您所见,问题中的所有数据都被优雅地使用,并且没有任何硬核计算。
建议不要使用外部消息源,但在这种情况下,我不禁建议阅读以下内容:
看看您是否可以回答以下问题:
90
90/25〜4
20
500
答案 1 :(得分:1)
鉴于时间复杂度,您无法计算算法的确切运行时间(以秒为单位)。但是,它确实使您可以很好地了解所测时间的增长率。 p>
在线性时间算法(O(n))中,预计时间将随着输入的增加而线性增加。例如,如果在一台计算机上处理10,000个项目需要一秒钟,那么您应该预期50,000个项目大约需要5秒,依此类推。在二次算法(O(n ^ 2))中不是这种情况,当输入大小较大时,该算法会更多地“惩罚”您;输入大小增加x2将导致处理时间增加x4,输入大小增加x5将导致处理时间增加x25,依此类推(就像函数F(x)= x ^ 2一样)。
答案 2 :(得分:0)
Big-O不会通知您条目大小和执行时间之间的确切相关性,而是告诉您条目大小增长和执行时间增长之间的近似相关性是什么。因此:O(n)
复杂度意味着条目大小和执行时间成正比(如果输入大3倍,那么执行时间也将长3倍),O(n^2)
意味着如果条目的大小是3倍,那么执行时间将是9倍,等等。
对于您来说,大小为50的条目的初始执行时间为10秒。如果输入更改为大小为100的条目,则只需除以即可将其放大100 / 50 = 2
倍。知道算法的Big-O为O(n^2)
,我们可以知道执行时间将是2^2 = 4
倍。因此,如果初始执行时间为10秒,则较大输入的执行时间将约为10 seconds * 4 = 40 seconds
。
有关SO的问题:Rough estimate of running time from Big O
关于big-o的不错的文章:https://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation/