我读到Big O表示法的正式定义是:
如果存在常数c和n0,则T(n)被认为是O(f(n))其中对于所有n,T(n)<= c.f(n)+ n0> N0。但我想知道,这并不意味着如果算法是O(n),它也必须是O(n ^ 2)和O(n ^ 3)等?
当然,如果存在常数c和n0,其中对于所有n,T(n)&lt; = c.n + n0&gt; N0。还必须有常数c和n0,其中对于所有n,T(n)<= c。(n ^ 2)+ n0。 N0。
事实上,如果你选择c =无穷大,每个算法都可以说有O(1),因为任何T(n)都是&lt; = infinity.1 + n0。
我知道这完全违背了Big O符号的目的。但我想知道我哪里出错了,以及我错过了什么。
答案 0 :(得分:1)
O(n)是函数的集,当我们说“T(n)是O(n)”或甚至“T(n)= O(n)”时,我们只是马虎而且应该更正确地说“T(n)在 O(n)”。
如您所知,O(n ^ 2)是O(n)的超集,O(n ^ 3)是O(n ^ 2)的超集,因此如果T(n)在O中(n),那么它也在O(n ^ 2)和O(n ^ 3)。
第二部分你错了,但是:无穷大不是一个实数,所以你不能把它当作一个常数并推断出一切都在O(1)中。