数据结构与算法的分析 —— 渐进复杂度(三个记号)

对于某些问题,一些算法更适合于用小规模的输入,而另一些则相反。幸运的是,在评价算法运行效率时,我们往往可以忽略掉其处理小规模问题时的能力差异,转而关注其在处理大规模数据时的表现。道理是显见的,处理大规模的问题时,效率的些许差异都将对实际执行效率产生巨大的影响。这种着眼长远,更为关注时间复杂度的总体变化趋势和增长速度的策略和方法,即所谓的渐进分析(asymptomatic analysis)。

1. 大 O 记号

出于保守的估计,我们首先关注 T(n) 的渐进上界,为此引入大 O 记号。具体地,若存在正的常数 c 和函数 f(n) ,使得对任何 n>>2 都有:

T(n)cf(n)

则可认为在 n 足够大之后,f(n) 给出了 T(n) 增长速度的一个渐进上界,此时,记之为:
T(n)=O(f(n))

由这一定义,可导出大 O 记号的以下性质:

  • (1)对于任一常数 c>0,有 O(f(n))=O(cf(n))

    c>c ,则 cf(n)cf(n)

    • (2)对于任意常数 a>b>0 ,有 O(na+nb)=O(na)

      na+nb2na

    2. 大 Ω 记号

    为了对算法的时间复杂度最好情况做出估计,需要借助另一个记号,如果存在正的常数 c 和函数 g(n),使得对于任何 n>>2 都有:

    T(n)cg(n)

    就可以认为,在 n 足够大之后,g(n) 给出了 T(n) 的一个渐进下界。此时我们记之为:

    T(n)=Ω(g(n))

    与大 O 记号恰好相反,大 Ω 是对算法执行效率的乐观估计,对于规模为 n 的任意输入,算法的运行时间都不低于 Ω(g(n))

    3. 大 Θ 记号

    借助大 O 记号,大 Ω 记号,可以对算法的时间复杂度做出定量的界定,亦即,从渐进的趋势看, T(n) 介于 Ω(g(n)) O(f(n)) 之间。若恰巧出现 g(n)=f(n) 的情况,则可以使用另一个记号表示,如果存在正的常数 c1<c2 和函数 h(n) ,使得对于任何 n>>2 ,都有,

    c1h(n)T(n)c2h(n)

    就可以认为在 n 足够大之后,h(n) 给出了 T(n) 的一个确界,我们记之为:

    T(n)=Θ(h(n))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值