我在尝试掌握大O符号的概念时遇到了一些问题。因此,根据定义,大O如下,T(n) ∈ O(G(n)) if T(n) <= G(n) * C
。
因为常数“C”可以是任何整数> 0,以下这个例子也不会成立吗?
示例:
n log n ∈ O(log n)
n log n <= log n * c
其中C等于n的值。
我知道答案是n log n ∉ O(log n)
,但我不明白,因为C可以是任何常数。
先谢谢你的帮助:D
答案 0 :(得分:11)
c只是一个常量。这意味着你不能说“让c为n的值”,因为你必须首先选择一个c然后允许比较为所有n。
换句话说,为了使一些T(n)为O(G(n)),必须存在 no 常数c,使得G(n)* c大于T (n)所有n。
因此,n log n不是O(log n),因为无论你选择什么常数,n&gt; c将导致n log n大于c log n。
答案 1 :(得分:4)
让我重复一遍。
c可以是任何常量。
这意味着c不能依赖于n。
答案 2 :(得分:4)
这个想法是不平等适用于任何n和固定的 c。所以你可能会发现某个c,n log n&lt; c log n,(即任何c> n),你可以很容易地找到它不能保持的其他n'(即n'> c)。
答案 3 :(得分:2)
首先,如果n = C则C不是常数。在大多数现实世界的算法中,C很小,因此大O部分通常在n的典型值中占主导地位。
但是大O复杂性关注大n算法的效率,特别是当n接近无穷大时。换句话说,它告诉你算法的可扩展性:给定算法处理非常大或加倍的工作量的程度。
如果您知道n 总是小,那么big-O复杂度并不重要,相反,您应该关注算法所需的挂钟时间。此外,如果您在两个具有相同大O复杂度的算法(例如O(n log n))之间进行选择,通常一个比另一个好(例如,随机数据快速排序通常优于二进制堆排序)。 / p>
答案 4 :(得分:1)
在定义中,您应该仅通过T和G本身来确定C.这就是常数C的含义。所以C不应该依赖于它们的输入。所以你不能考虑C = n
答案 5 :(得分:1)
在表达式n log n中,您无法将外部n与C进行比较,就像您正在做的那样。这就像采用algrebraic表达式x(x + 1)并用常量替换其中一个x。
在n log n中,n是变量。在大O表达中,C是常数。
答案 6 :(得分:1)
n的值取决于输入集,C的值是固定的。
所以是的,如果n = 16且C = 256,对于小输入集,它看起来像n ^ 2 * lg(n)。现在将输入设置增加到100,000,000; C的值保持在256,你现在有256 * lg(100,000,000)
答案 7 :(得分:1)
每当我遇到大喔时,我觉得将其视为竞争对手很有用: 我选择了一个很大的函数(在你的情况下,logn)和一个常量(c)。重要的是我必须选择一个真正的价值。我通常选择一千,只是因为。 然后我必须让我的主要对手选择他选择的任何。他通常选择十亿。
然后我进行比较。
为了完成这个例子,10 ^ 9 *(log(10 ^ 9))现在明显比1000log(10 ^ 9)大得多。因此,我知道大哦不行。
答案 8 :(得分:0)