我的测试中给出了以下问题:
以下哪项是O(n)?
a) n + lgn
b) n + 2n
c) n + n^2
d) 1000n + 4500lgn + 54n
我知道O(n)的时间复杂度取决于元素的数量,因此元素的数量增加了完成操作所花费的时间。根据这个逻辑,是否正确地说a和c需要时间复杂度为O(n)?
答案 0 :(得分:3)
考虑O(n)的定义,对于某些函数f(n),必须有两个正常数c
和k
,这样c > 0
,{ {1}},k > 0
和n >= k
。如果我们可以证明常量0 <= f(n) <= cn
和c
存在,那么函数是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) = n
,n^2
,lgn
都是有趣的边界(可能会在测试中) 。
是nlgn
O(n ^ 2)?您不应该找到值n + n^2
和c > 0
,k > 0
,而不是n >= k
。
看一看 https://xlinux.nist.gov/dads//HTML/bigOnotation.html进一步阅读。