最高增长顺序是最慢的吗?

时间:2014-03-12 04:00:19

标签: algorithm big-o

增长函数的更高阶次需要花费最长时间吗?那么,O(n 2 )花费的时间少于(2 n )?

当N是一个大数字时,增长函数的最高阶数实际运行的时间是否最长?

3 个答案:

答案 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轴向上弯曲的程度越大。

Comparison of several polynomials relevant to Big-O

如果不清楚,这里的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个元素