Big o 当n的值变得非常小时,大O?

Big o 当n的值变得非常小时,大O?,big-o,Big O,我错过了介绍big-O的那节课,当时我觉得它非常直截了当。然而,似乎仍然是,老师说,当n变得非常小时,O(n)偏离函数?我在书中任何地方都找不到这个。有人能启发我吗?我们对O(n)的探索是在排序算法的背景下进行的,如果这有任何意义的话 谢谢 基因 编辑: 感谢大家的帮助,这一切都很有启发性。我有一个后续问题。有没有一个相对简单的数学方法来计算n对于O(n)来说太小的点 相关问题 大O并不描述函数的执行时间,只描述函数的增长。所有函数都有一些需要添加的常量因子或开销。当n较低时,这一开销会使算

我错过了介绍big-O的那节课,当时我觉得它非常直截了当。然而,似乎仍然是,老师说,当n变得非常小时,O(n)偏离函数?我在书中任何地方都找不到这个。有人能启发我吗?我们对O(n)的探索是在排序算法的背景下进行的,如果这有任何意义的话

谢谢 基因

编辑: 感谢大家的帮助,这一切都很有启发性。我有一个后续问题。有没有一个相对简单的数学方法来计算n对于O(n)来说太小的点

相关问题



大O并不描述函数的执行时间,只描述函数的增长。所有函数都有一些需要添加的常量因子或开销。当n较低时,这一开销会使算法的任何改进大大相形见绌-一个每次操作需要50ms但有O(n)的算法对小n的性能比一个每次操作需要5ms但有O(n*n)的算法差


这就是为什么,一般来说,对于小集合,大O并不重要。对于大多数具有简单比较的对象,对10个项目的快速排序不会明显快于冒泡排序,对100个项目的线性搜索可能会快于二叉树,以此类推。

课程材料变得更难理解,因为参加的讲座数量(N)变得非常小。

以下可能是“当n变得非常小时,O(n)偏离函数”的示例:

例如,考虑一个需要时间“50乘以n,再加上n平方”的运算

当n较大时,“n平方”项将占主导地位,因此运算可以称为“O(n平方)”


然而,当n很小时,“n平方”项可以忽略不计,“50乘以n”项将占主导地位,因此当(且仅当)n很小时,可以说它是O(n)。

要扩展上面的答案,大Oh表示法测量函数的最终增长或其极限行为

f=O(g)当且仅存在一个N和一个常数c(可以是函数 对于N)使得对于所有N>N,

f(n)大O符号背后的概念是算法的渐近性能。当N变大时,大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=1000,c=1000000

 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下的性能将完全被误解。在high N中,低阶项并不重要。

这是一个很大的话题,但为了完整起见,我想提及一些与big_o符号相关的其他符号,它们通常用于理论计算机科学中,你可以在计算机科学文献中找到:bigΘ符号,大Ω表示法和小o表示法。这些只是对增长率的其他(更严格)描述。little-o表示法很容易被误认为是big-o表示法

little-o也是两个函数f(x)和g(x)之间的关系。说‘f(x)是g(x)的little-o’意味着f(x)的增长比g(x)快得多。在更多的数学实验中,当x接近无穷大时,f(x)/g(x)的极限为零

如前面的答案所述,大O表示法用于描述算法增长率的上界。这实际上是两个函数f(x)和g(x)之间的关系,其中f(x)=O(g(x))随着x的无穷大


请参阅,以获得不同符号的简洁明了的表示。

根据定义:
f(n)=Θ(g(n))表示所有函数f(n)集合,因此需要有常数c1c2以及n0,其中所有这些情况都为真

  • c1。g(n)是一个非负项或0

  • c1。g(n)如果你省略了“非常”这个词,我认为这是有道理的。你确定吗?我被教导总是删除修饰语“very”,除非它可以被替换为“damn”。我忘了这是谁的建议了你的辅助问题——看看构成成本的不同条件下的常数。O(N)是一个用常数节省时间的简写,但正如我的例子所表明的,你必须知道常数来确定盈亏平衡点。乔恩·本特利(Jon Bentley)在《编程珍珠》(Programming Pearls)中的一篇专栏文章中漂亮地阐述了这一点;他用立方算法运行Cray,用线性算法运行TRS-80。高达5000码(IIRC),克雷获胜;从那以后,TRS-80就大幅度地做到了。谢谢Jon。所以O(n)基本上是f(x)[算法中精确运算次数的函数]的前导系数(这是正确的词吗?)。因此,我必须设置f(x)=0并求解x,以找到O(n)不再有用的集合大小。这是对的吗?@Gene:或多或少。表示法O(n)表示法意味着随着问题的大小n朝无穷大的方向增加,表达式C=a*O(n)变得越来越精确,因为其他项的贡献比主导项(领先项)小。O(n)不是系数本身;这个表达式乘以一个系数。因此,如果成本C(n)=an^3+bn^2+cn+d,则随着n的增加,系数a和n^3中的项意味着表达式为O(n^3)-立方项主导成本;C(n)~=an^3,对于足够大的n值。。。继续…线性搜索性能取决于比较成本;对于复杂的测试,二进制搜索可能比线性搜索快得多