Big-O表示法包含哪些功能?

时间:2017-09-09 16:02:39

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

我正在学习Big-O Notation并正在完成一项任务,我被困在了。基本上,我被赋予了不同的功能,并且必须为它们编写Big(O)。我认为我的困惑在于Big-O中可以包含哪些功能。我理解这个层次结构如下: O(1) O(LOGN) 上) O(nlogn) 为O(n ^ 2) O(2 ^ n)的 为O(n!)

我也理解为什么常常忽略常量和较小的术语,因为我们只是在寻找一个界限。我的问题是当函数没有用这些术语编写时会发生什么。例如(这不是我的确切问题,但相似),3 ^ n不是2 ^ n的常数倍。是大O还是O(3 ^ n)还是O(2 ^ n)?我的想法是O(3 ^ n),因为3 ^ n比2 ^ n增长得快,而大O是上限。但是我还没有看到Big O用上面列出的不是2或n的基数来表达。这是正确的想法吗?

3 个答案:

答案 0 :(得分:4)

  

Big-O表示法中包含哪些功能?

所有这些 *

但是,某些功能更常用,例如您提到的O(logn)。原因是我们试图用大多数算法解决的问题的性质(例如排序),这使得我们比其他算法更频繁地使用某些函数作为上界。

PS:更具体地说,它是一个类列表,其中n渐近渐近无穷大。更多阅读Order of functions

答案 1 :(得分:1)

对于您的具体问题,O(3^n)O(2^n)不同。一种看待这种情况的方法是将值的比率看作n - >。无穷。在这种情况下,比率是:

(1.5)^n

这种情况不受限制地增长。

同样,n^3n^2不同,因为比率为:

n

这种情况不受限制地增长为n - >;无穷大。

另一方面,3*n2*n是相同的。他们的比例是:

1.5

增长为n - >无穷大。

了解并非所有函数都用于big-O非常重要。基本上,"论证"在big-O中代表一类具有与n - >相同的渐近行为的函数。无穷。通常选择该类中最简单的成员来表示。

请记住,大O是上层对复杂性的约束。在实际分析算法时,可能会使用更复杂的函数并包含常量。实际上,这些非常重要,并解释了为什么像小泡数排序这样的算法对于小数据集可能是最佳的,即使它对大数据集来说不是最佳的。

答案 2 :(得分:0)

正式f(x) = O(g(x))当且仅当存在常量c>0n>0时:{/ p> 所有x大于或等于n的

c*g(x) > f(x)

考虑到这个定义,您可以将任何函数插入O,您将获得一组满足该属性的函数。

考虑它的另一种方法是将O定义为从函数到函数集的函数。也就是说,对于常数O(g) = { f : c*g(x) >= f(x) for all x > n}cn如上所述。使用此定义可以说f 位于 O(g)中,恕我直言更有意义,但出于历史原因,我们仍然使用等号符号。

现在,看看定义我们可以理解你提到的层次结构。 O(n^2)O(n) n = O(n^2)因为n^2 = O(n)为真,但O(n!)为假(请注意我不使用!=作为= sign in the O notation is not a real equals但是任意句法符号你也可以用矮人符文代替)。

另一件事,如果你想在作业中作弊,只需回答db.posts.Select(p=> new PostlDto{Title= p.Title, VoteCount= p.Votes.Count}) 的所有内容,你就会在技术上正确(最好的正确)。现在,通常当人们问起这个功能的顺序是什么时候#34;正在要求一个紧密的约束,这是仍然充当约束的最小增长函数。您也可以查看the definitions for other related notations