O(n ^ 2)是否大于O(n ^ 2 log n)?
如是 ?怎么样?
我们能举一个简单的例子吗
另外,
以下代码的复杂性是什么?
int unknown(int n){
int i,j,k=0;
for(i=n/2;i<=n;i++){
for(j=2;j<=n;j=j * 2){
k =k + n/2;
}
}
return k;
}
什么是返回值k的复杂性?
答案 0 :(得分:12)
O(n^2)
是O((n^2) * log(n))
的子集,因此第一个是“更好”,很容易看出,因为log(n)
是一个增加的函数通过将某些东西与它相乘,你得到一个“更高”的函数,然后是原始函数(f(n) <= f(n) * log(n)
为每个增加的非负值f
和n>2
)
你给出的代码捕捉是O(nlog(n))
,因为内循环每次外循环迭代重复log(n)
次,外循环重复n / 2次 - 这给你n/2 * log(n)
在O(nlog(n))
答案 1 :(得分:2)
Ln(e)== 1,因此大于e(~2.7)的任何值都将给出Ln(n)> 1。
因此对于所有n,其中n> e,O(n ^ 2 ln(n))> O(N ^ 2)
答案 2 :(得分:0)
我假设你的意思是O((n^2) * log n)
,但答案是一样的,如果它是n^(2 * log n)
,你需要证明的基本相同。我也只会考虑非负函数,以便用绝对值来节省一些麻烦。
答案是O(n^2)
是O((n^2) * log n)
的严格子集。它更小。
首先证明它是一个子集:假设f
是O(n^2)
。然后存在M
和k
,以便所有n >= M
,f(n) <= k(n^2)
。
设L = max(M, e)
(其中e是对数基数)。然后适用于所有n >= L
,log(n) >= log(e) == 1
(自n >= 1
}和f(n) <= k(n^2)
(自n >= M
起)。
因此对于所有n >= L
,f(n) <= k(n^2) * log(n)
。因此f
位于O((n^2) * log n)
。
其次,证明它是一个严格的子集:让g
成为函数g(n) = (n^2) * log n
,因此g
位于O((n^2) * log n)
。
对于任何k
,请L = e^k
。然后,对于任何n > L
,log(n) > k
以及g(n) > n^2 * k
。
因此g
不在O(n^2)
,因为M
和k
不存在n >= M
,g(n) <= k * n^2
。< / p>