如何确定给定函数是否为O(n)?

时间:2016-05-07 15:35:38

标签: java data-structures time big-o

我的测试中给出了以下问题:

以下哪项是O(n)?

a) n + lgn b) n + 2n c) n + n^2 d) 1000n + 4500lgn + 54n

我知道O(n)的时间复杂度取决于元素的数量,因此元素的数量增加了完成操作所花费的时间。根据这个逻辑,是否正确地说a和c需要时间复杂度为O(n)?

1 个答案:

答案 0 :(得分:3)

考虑O(n)的定义,对于某些函数f(n),必须有两个正常数ck,这样c > 0,{ {1}},k > 0n >= k。如果我们可以证明常量0 <= f(n) <= cnc存在,那么函数是O(n)(如果这些常数不存在则函数实际上大于O(n))。

让我们看看k。这是O(n)吗?如果是这样,那么我们就不会在找到c和k的值时遇到任何麻烦。

F(n) = n + lg(n)

让我们将0 <= f(n) <= cn 0 <= n + lg(n) <= cn 设置为2并考虑n为2的基本情况(因为n> = k)。

k

让我们看看当n增加时函数的行为(设置n = 4,看看会发生什么)。

0 <= 2 + lg(2) <= c * 2
0 <= 2 + 1 <= 2c
0 <= 3 <= 2c
0 <= 3/2 <= c

所以我们找到了常量(c = 3/2和k = 2),所以这个函数是正式定义的O(n)。

让我们看看0 <= 4 + lg(4) <= c * 4 0 <= 4 + 2 <= 4c 0 <= 6 <= 4c 0 <= 6/4 <= c 0 <= 3/2 <= c .. take a look at that, it doesn't matter how large n becomes, c is 3/2 。这是O(n)吗?应该很明显,它不是,实际上是O(n ^ 2),但是让我们看看我们是否能找到值c和k无论如何。

F(n) = n + n^2

让我们再次将0 <= f(n) <= cn 0 <= n + n^2 <= cn 设置为2,并考虑n = k的基本情况。

k

让我们看看当n增加时会发生什么(现在n = 4)

0 <= 2 + 2^2 <= c*2
0 <= 2 + 4 <= 2c
0 <= 6 <= 2c
0 <= 3 <= c   .. so IF this is O(n), c is at least 3

此功能不是O(n) - 我们无法找到常数值0 <= 4 + 4^2 <= 4c 0 <= 4 + 16 <= 4c 0 <= 20 <= 4c 0 <= 20/4 <= c 0 <= 5 <= c .. last time c was 3, now its 5 ... as n increases, c is not constant! c,因为它们根本不存在。

考虑f(n)= 5n ......这是O(n)(在这种情况下显然c是5)。考虑f(n)= n * n ..这不是O(n)(c等于n,它不是常数)。我们真正说的是我们的函数f(n)受另一个函数g(n)乘以某个常数的约束。当我们询问函数是否为O(n)时,我们让k,但g(n) = nn^2lgn都是有趣的边界(可能会在测试中) 。

nlgn O(n ^ 2)?您不应该找到值n + n^2c > 0k > 0,而不是n >= k

看一看 https://xlinux.nist.gov/dads//HTML/bigOnotation.html进一步阅读。