证明O(n)不是O(n log n)的子集

时间:2017-10-15 22:27:23

标签: algorithm asymptotic-complexity

我看到O(2n)的证明与此帖子中的O(n)相同=> Which algorithm is faster O(N) or O(2N)? 这意味着O(n)与O(4n)相同。

有人能告诉我O(n)不是O(n log n)的子集吗? 因为,如果n = 16且base = 2,O(n log n)将为O(n * 4),这应该是O(n)?
我知道上面的陈述是错误的。但不确定哪一部分。请澄清一下。

2 个答案:

答案 0 :(得分:2)

  

因为,如果n = 16且base = 2,O(n log n)将为O(n * 4),这应该使它成为O(n)?

这是对O(n log n)的含义的基本误解。

O(n log n)一组功能。直观地说,它是所有函数{g(n)}的集合,其中g(n)f(n) = n log n成比例。

(有一个严格的数学定义是什么"比例"意味着处理尴尬的边缘情况,但你需要理解"限制" ......这是相对高级的数学。 ..理解定义。)

你正在用一个值代替参数......这在数学上是没有意义的。从表面上看,您评估 O(n log n)作为n某些值的函数。如果O(...)表示函数,那可能是有意义的。但它并没有。

Big O是一组数学符号,用于以特定方式与给定函数相关的一组函数。并且(直观地)关系是关于n变大时会发生什么。您可以用n替换特定值,并保留符号的含义。

(你所做的事情与取消x中的 d(x.x) ------ dx 一样具有数学意义:

users
   user1
      nodeA
        nodeToBeMoved
            content : content1
            date : date1
   user2
      nodeB

...或其中一个男生"证明"那个是零,需要除零。)

为了更深入地了解为什么你的替代是毫无意义的,请查看Big Oh符号的更正式定义;例如在Wikipedia。如果你知道有什么限制。

答案 1 :(得分:0)

你不能说n = 16。然后你将它视为常数。 n是一个变量。

看看O(n²)。如果n = 16,那么O(n²)= O(16 * n)= O(256)= O(1)

它适用于任何复杂性。考虑O(n!),就像旅行推销员一样。如果n = 16,则O(n!)= O(16!)= O(巨大常数)= O(1)

此外,正如chepner所指出的,O(n)是O的一个子集(n log n)。你真正的问题是集合O(n)和O(n log n)是否相等,它们不是。