为什么只有一个关于复杂性类的给定陈述是正确的?

时间:2015-06-03 00:18:44

标签: algorithm big-o time-complexity complexity-theory

显然,对以下问题的正确答案是(C),但为什么其他选项在我们知道n的值之前是不正确的?

如果n = 1,除了(B)之外,所有这些似乎都是正确的!我哪里错了?

  

以下哪项不是O(n 2 )?

     

(A)15 10 * n + 12099   
  (B)n 1.98   
  (C)n 3 /√n   
  (D)2 20 * n

3 个答案:

答案 0 :(得分:2)

Wikipedia说: -

  

大O.   符号描述了函数的限制行为   论证倾向于特定的值或无穷大,通常在   更简单的功能。通常仅以大O表示法描述函数   为函数的增长率提供 上限

上限意味着f(n)= n可表示为O(n),O(n 2 ),O(n 3 ),以及其他功能,但不包括其他功能,如O(1),O(log n)。

因此,朝着同一方向前进,现在您可以轻松地消除选项,如下所示: -

  1. 15 10 * n + 12099< c * n 2 ,对于某些n> 1。 √12100即n> 110 ---因此是O(n 2 )。

  2. n 1.98 < n 2 ,对于所有n> 1 ---并且是O(n 2 )。

  3. n 3 /√n= n 5/2 > n 2 对于所有n> 1 ---因此,不是O(n 2 )。

  4. 2 20 * n = 1024 * 1024 * n<所有n的c * n 2 1,其中c = 1024 * 1024 ---因此,是O(n 2 )。

  5. 因此,唯一不满足O(n 2 )的选项是选项C,即 f(n) = (n^3 / (sqrt(n))) 。这里, (n 3 /(sqrt(n)))不等于O(n 2

答案 1 :(得分:0)

虽然Shekhar Suman的回答解释了为什么官方答案在每种情况下都是正确的,但它没有回答这部分问题:“显然对以下问题的正确答案是(C),但为什么另一个选项不正确,直到我们知道n的值为止? 如果n = 1 ,除了(B)外,所有这些似乎都是正确的! 我哪里出错?“(我的突出显示)。

我建议我用粗体表示的前两部分表明提问者 - 在提问时 - 没有掌握,即O-notation用于表达有关函数的信息,而不是表达特定的表达式值

这意味着说“如果n = 1,f(n)是O(n 2 ”是没有意义的,因为这是一个关于一个的声明value,f(1),而不是函数f。

同样地,“直到我们知道n 的值”在谈论函数时没有意义,因为 n 是一个绑定变量, ie仅用于将 n 与涉及 n 的表达式相关联以定义函数。

答案 2 :(得分:-2)

所有选项都没有n ^ 2。

(15 ^ 10)* n + 12099是n阶

n ^ 1.98的顺序为n ^ 1.98

n ^ 3 /(sqrt(n))的顺序为n ^ 2.5

(2 ^ 20)* n是n阶

您可以通过将两个函数除以另一个函数来检查两个函数是否具有相同的顺序。当n变为无穷大时,它应该倾向于变为常数。