• 大 O、大 Omega、大 Theta 的区别,O(n) 复杂度是什么意思



    1 O、Ω、Θ 的定义

    在数学、算法分析里,O、Ω、Θ 都是在描述两个函数的渐近增长速度,通常讨论 n→∞ 时的关系。

    最核心的区别是:

    O=渐近上界,Ω=渐近下界,Θ=同阶/紧确渐近界

    更严格地说,给定两个非负函数 f(n) 和 g(n)。

    • f(n)=O(g(n)):存在常数 c>0,n0,使得对所有 n≥n0,

      f(n)≤cg(n).

      意思是:f 最终不会比 g 快超过一个常数倍。

    • f(n)=Ω(g(n)):存在常数 c>0,n0,使得对所有 n≥n0,

      f(n)≥cg(n).

      意思是:f 最终至少有 g 这么快的增长量级。

    • f(n)=Θ(g(n)):存在常数 c1,c2>0,n0,使得对所有 n≥n0,

      c1g(n)≤f(n)≤c2g(n).

      也就是:

      f(n)=O(g(n))且f(n)=Ω(g(n)).

      意思是:f 和 g 的增长速度是同一个数量级。

    可以这样记:

    符号 含义 直觉
    O(g(n)) 上界 “最多这么快”
    Ω(g(n)) 下界 “至少这么快”
    Θ(g(n)) 上下界一致 “就是这个量级”

    如果画成一种直观的“夹住”关系:

    f(n)=O(g(n))⟹f(n) 在上面被 g(n) 的常数倍压住,f(n)=Ω(g(n))⟹f(n) 在下面被 g(n) 的常数倍托住,f(n)=Θ(g(n))⟹f(n) 被 g(n) 的两个常数倍夹住.

    2 举例

    比如 f(n)=3n2+10n+100,那么:

    f(n)=O(n2),

    因为它最终不会超过某个常数倍的 n2。

    同时:

    f(n)=Ω(n2),

    因为它最终也至少是某个常数倍的 n2。

    因此,我们有:

    f(n)=Θ(n2).

    注意,这里有一个容易混淆的点:我们常用的大 O 不等于“精确复杂度”。例如,上面的函数不仅有 f(n)=O(n2),也完全可以说

    f(n)=O(n3),f(n)=O(n4),f(n)=O(2n).

    这些都没错,因为它们都是上界,只是比较松。

    相反,f(n)=Θ(n2) 表达的信息更强:它明确告诉你真正的渐近数量级就是 n2。

    再举一个例子,例如:

    n=O(n2),

    是对的,因为

    n≤n2

    在 n≥1 时成立。

    但是

    n≠Θ(n2),

    因为 n 和 n2 并不是同一个增长量级。

    反过来:

    n2=Ω(n),

    也是正确的。

    3 另外一个判断方式:看 n → ∞ 的极限

    另外一个很有用的判断方式是看极限。如果

    limn→∞f(n)g(n)=L,0<L<∞,

    那么通常可以直接得到

    f(n)=Θ(g(n)).

    例如:

    limn→∞3n2+10n+100n2=3,

    所以

    3n2+10n+100=Θ(n2).

    在算法里,如果一个程序运行时间是

    T(n)=5n2+3n+10,

    最准确的渐近描述通常是

    T(n)=Θ(n2),

    而说 T(n)=O(n2) 只是给出了它的上界。



本文作者:MoonOut

本文链接:https://www.cnblogs.com/moonout/p/23083800

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

  • 相关阅读:
    Podman 部署私有镜像仓库
    Nvm 安装
    c# Parallel.For 循环内多线程并行操作
    小谈设计模式(16)—抽象工厂模式
    python机器学习库中Scikit-learn和TensorFlow如何选择?
    人大金仓分析型数据库JSON索引
    齐岳定制:DBCO-PEG-Mesylate|二苯并环辛炔-聚乙二醇-甲磺酸酯
    Java变量类型 Java进阶必看
    分布式、锁、延时任务
    通过ad18软件设计一个流量监测报警装置
  • 原文地址:https://www.cnblogs.com/moonout/p/23083800