增长函数的更高阶次需要花费最长时间吗?那么,O(n 2 )花费的时间少于(2 n )?
当N是一个大数字时,增长函数的最高阶数实际运行的时间是否最长?
答案 0 :(得分:1)
Big O Notation的想法是表达算法复杂度的最坏情况。例如,使用循环的函数可以描述为O(n),即使它包含多个O(1)语句,因为它可能必须在n个项目上运行整个循环。
n
是您正在测量的算法的输入数。就n而言,Big-O告诉您当输入数量变得越来越大时该算法将如何执行。这可能意味着需要花费更多时间来执行,或者某些内容需要更多空间来存储。如果您注意到您的算法具有较高的Big-O(如O(2 ^ n)或O(n!)),则应考虑更好地扩展的替代实现(假设n将变大 - 如果n总是很小)没关系)。这里的关键点是,Big-O对于向您显示两个算法中哪个算法可以更好地扩展,或者可能只是一个算法将成为性能严重瓶颈的输入大小非常有用。 / p>
这是一个比较几个多项式的示例图像,这些多项式可能会让您了解它们在Big-O方面的增长率。当n接近无穷大时,生长时间是 ,在图形方面,随着x变大,函数沿y轴向上弯曲的程度越大。
如果不清楚,这里的x轴是你的n
,y轴是时间。你可以从中看到更快,例如,O(n ^ 2)会比O(n)更耗费时间(或空间或其他)。如果您绘制更多图形并缩小,您将看到令人难以置信的差异,例如,O(2 ^ n)和O(n ^ 3)。
使用比较两个大小为20的字符串数组的示例,假设我们这样做(伪代码,因为这是语言不可知的):
for each needle in string_array_1:
for each haystack in string_array_2:
if needle == haystack:
print 'Found!'
break
这是O(n ^ 2)。在最坏情况场景中,它必须完全通过第二个循环(如果没有找到匹配),在第一个循环的每次迭代上发生。对于两个大小为20的数组,这是总共400次迭代。如果每个数组都被一个字符串更改为21,那么最坏情况中的迭代总数会增加到 441 !显然,这可能会很快失控。如果我们有1000个或更多成员的阵列怎么办?请注意,将n
视为20是不正确的,因为数组可能具有不同的大小。 n
是一个抽象,可以帮助您了解在越来越多的负载下可以获得多么糟糕的东西。即使string_array_1的大小为20且string_array_2的大小为10(或30或5!),这仍然是O(n ^ 2)。
答案 1 :(得分:0)
O-time仅在与自身进行比较时才相关,但2^n
的增长速度会快于n^2
。
随着n的增长进行比较:
N n^2 2^n
1 1 2
2 4 4
3 9 8
4 16 16
5 25 32
6 36 64
...
10 100 1024
20 400 1048576
相关链接:Wolfram Alpha
答案 2 :(得分:0)
你可以反过来思考:让算法成为T(n) = t
;我可以及时处理多少元素2.t
?
O(n^2)
- > 41%元素更多((n + 0.41 n)^2 = 2.n^2
)
O(2^n)
- >单个元素更多(2^(n+1) = 2.2^n
)
或及时1000000.t
?
O(n^2)
- > 1000倍以上
O(2^n)
- >更多20个元素