我错过了引入big-O的课程,认为这是非常直接的。然而,当n变得非常小时,老师似乎仍然会说O(n)偏离函数?我无法在书中的任何地方找到这个。有人可以开导我吗?我们对O(n)的探索一直是在排序算法的背景下,如果它具有任何意义。
由于 基因
编辑: 感谢帮助人员,它一直很有启发性。我有一个后续问题。是否有一种相对简单的数学方法可以找出n对于O(n)来说太小的点?
相关问题
are there any O(1/n) algorithms?
What is the difference between Θ(n) and O(n)?
答案 0 :(得分:22)
Big O没有描述函数的执行时间,只是增长。所有函数都有一些需要加入的常数因子或开销。当n很低时,这种开销会使算法的任何改进相形见绌 - 一种算法需要每次操作50ms但是O(n)对小n的性能会更差而不是每个操作需要5毫秒但是有O(n * n)的算法。
这就是为什么一般来说,对于小套装来说,大O并不重要。对于大多数具有简单比较的对象,对10个项目的快速排序不会明显快于冒泡排序,对100个项目的线性搜索可能比二叉树更快,依此类推。
答案 1 :(得分:11)
Big-O表示法背后的概念是算法的渐近性能。随着N越来越大,Big-O表示法中的术语占据了总时间的主导地位。例如,在O(N ^ 2)算法中,总时间T(N)可能是:
T(N) = a * N * N + b * N + c
随着N越来越大,无论b或c的值如何,N ^ 2中的术语都占主导地位。
当N很小时,b和c术语很重要。
例如,如果a = 0.001,b = 1,000,c = 1,000,000。
N ~ T(N) [1 significant figure]
1 1,000,000 (almost all c)
1,000 2,000,000 (50:50 split on b and c)
1,000,000 2,000,000,000 (50:50 split on a and b)
1,000,000,000 1,000,000,000,000,000 (almost all a)
所以,如果你忽略了低阶条款,那么低N的表现就会被完全歪曲。在高N时,低阶项并不重要。
答案 2 :(得分:7)
课程材料越来越难以理解,因为参加讲座的次数(N)变得非常小。
答案 3 :(得分:2)
以下是“当n变得很小时,O(n)偏离函数”的例子:
考虑一个需要例如时间“50次n加n平方”的操作。
当n很大时,“n平方”项将占主导地位,因此操作可以说是“O(n平方)”。
当n很小时,“n平方”项可以忽略不计,“50倍n”项将占主导地位,因此当(并且只有)n很小时,它可以说是O (n)的
答案 4 :(得分:1)
为了扩展上面的答案,Big-Oh表示法测量函数的最终增长或其限制行为。
f = O(g)如果且仅存在N和常数c(可以是函数)
N),对于所有n> N,
f(n)< = c * g(n)
假设f = 10000000 * n且g = n ^ 2.
f = O(g),但是如果你看n的值太小,比如说小于10000000 并设置c = 1, 你会看到g(n)< = f(n)。
要添加一个更极端的例子,你宁愿用一个算法来处理 复杂度n ^ 100000或复杂度为2 ^(。0000000001n)的算法。对于 合理的问题规模,后者更好。是什么让很多CS 如此美丽,它允许这种类型的滥用,然而,最自然 算法没有利用它。大多数多项式时间算法都有 小常数(至少在做了一点工作之后)。
祝你好运!答案 5 :(得分:0)
一个很大的话题,但为了完整起见,我想提一些与Big_o符号相关的其他符号,这些符号通常用于理论计算机科学,你可能会在计算机科学文献中找到它们:Big-Θ符号,大Ω符号和小符号。这些只是增长率的其他(和更严格)描述。小o符号很容易被误认为是大O符号。
little-o也是两个函数f(x)和g(x)之间的关系。说'f(x)是g(x)的小-o'意味着f(x)比g(x)生长得快得多。在更多数学上说,当x接近无穷大时,f(x)/ g(x)的极限为零。
如前面的答案所述,big-O表示法用于描述算法增长率的上限。它实际上是两个函数f(x)和g(x)之间的关系,其中f(x)= O(g(x)),因为x变为无穷大。
请参阅Big-o wikipedia page,了解不同符号的简洁明了。
答案 6 :(得分:0)
根据定义:
f(n)= Θ(g(n))表示所有函数f(n)的 集合,因此需要常量 c1 和 c2 和也是n0 ,其中所有这些情况都是 true :
所以我们需要做的就是选择使所有条件为真的c1,c2和n0。因此,对于c1 c2的某些组合,如果选择n< n0,你不能保证你的约束作品。我认为这就是你的老师所说的“偏差”。