zoukankan      html  css  js  c++  java
  • 主定理

    ghj1222

    先介绍几个符号的含义。

    符号(Theta),读音西塔,既是上界也是下界,等于,严格贴紧。

    符号(O),读音殴,表示上界,小于等于,贴紧未知。

    符号(o),读音也是殴,小于,不贴紧。

    符号(Omega),读音偶眯嘎,表示下界,大于等于,贴紧未知。

    符号(omega),读音也是偶眯嘎,表示下界,大于,不贴紧。

    上面的“贴紧”是我根据tight翻译过来的(不是很准确啊),大概就是是否严格等于的意思吧。

    意思就是(Theta)是平均时间复杂度,(O)是最坏情况下的复杂度,(Omega)是最好情况下的复杂度。

    假设我们有递推关系式:
    (egin{aligned}T(n)=aTleft(frac n b ight)+f(n)end{aligned})

    其中,(n)为问题的规模、(a)为递推下子问题的数量,(egin{aligned}frac n bend{aligned})为每个子问题的规模,(f(n))为递推后做的额外的计算工作。

    1.假设存在常数(epsilon>0),使得(f(n)=O(n^{log_b(a)-epsilon})),则(T(n)=Theta(n^{log_ba}))

    具体意思是f(n)的上界是n的幂次,且(log_b(a))比这个幂次要大,则时间复杂度为这个n的(log_b(a))次。

    例子:二叉树的遍历。(egin{aligned}T(n)=2Tleft(frac n 2 ight)+Theta(1)end{aligned})。其中(a=2)(b=2)(f(n)=1),此时(epsilon=1)(T(n)=Theta(n))

    2.假设存在常数(kge0),使得(f(n)=Theta (n^{log _{b}a}log ^{k}n)),则(T(n)=Theta(n^{log_ba}log^{k+1}n))

    具体意思是f(n)是n的(log_b(a))次,再乘以一个log,则复杂度是f(n)的复杂度再乘以一个log。

    例子:归并排序。(egin{aligned}T(n)=2Tleft(frac n 2 ight)+Theta(n)end{aligned})。其中(a=2)(b=2)(f(n)=n),此时(k=0)(T(n)=Theta(nlog_2n))

    例子:二分搜索(折半搜索)。(egin{aligned}T(n)=Tleft({frac {n}{2}} ight)+Theta (1)end{aligned}),其中(a=1)(b=2)(f(n)=1),此时(k=0),则(T(n)=Theta(log_2n))

    3.假设存在常数(epsilon >0) ,有(f(n)=Omega (n^{log _{b}(a)+epsilon })),同时存在常数(c<1)以及充分大的(n)满足 (afleft({frac {n}{b}} ight)leq cf(n))那么 (Tleft(n ight)=Theta left(fleft(n ight) ight))

    这个感觉没啥用啊。。。

    【例题】

    【NOIP2017初赛】若某算法的计算时间表示为递推关系式:

    (egin{aligned}T(N)=2Tleft(frac N 2 ight)+Nlog Nend{aligned})(T(1)=1),则该算法的时间复杂度为______________________________________________________。

    ( m A .O(N) B .O(Nlog_2N) C.O(Nlog_2^2N) D.O(N^2))

    【解析】套用情况2中的k=1的情况,则(T(n)=Theta(Nlog_2^2N)),选C

    【NOIP2016初赛】若某算法的计算时间表示为递推关系式:

    (egin{aligned}T(N)=2Tleft(frac N 4 ight)+sqrt Nend{aligned})(T(1)=1),则该算法的时间复杂度为______________________________________________________。

    ( m A .O(N) B .O(sqrt N) C.O(sqrt Nlog_2N) D.O(N^2))

    【解析】套用情况2中的k=0的情况,则(T(n)=Theta(sqrt(N)log_2N)​),选C

    【NOIP2015初赛】某算法的计算时间表示为递推关系式:

    (T(N)=T(N-1)+N)(T(0)=1)。则该算法的时间复杂度为______________________________________________________。

    ( m A .O(log_2^2N) B .O(Nlog_2 N) C.O(N) D.O(N^2))

    【解析】难道这个就要用主定理了?容易推导出(egin{aligned}T(N)=T(0)+1+...+n=1+frac{N*(N+1)}{2}end{aligned}),则时间复杂度为(O(N^2)),选D

    【总结】

    NOIP初赛考察了3年的时间复杂度分析,其中两年用到了主定理。其实你不会主定理也没事儿,只要能找几个特殊值带入,并根据符号(O)的意义排除选项即可。

  • 相关阅读:
    json的序列化 与 反序列化
    苹果审核被拒 2.3.10
    iOS基础问答面试
    论坛类应用双Tableview翻页效果实现
    iOS性能调优之Analyze静态分析
    win10 U盘安装ubuntu16.04双系统
    spring boot实战读书笔记1
    使用springBoot搭建REATFul风格的web demo
    es6编写generator报错
    vue开发环境搭建win10
  • 原文地址:https://www.cnblogs.com/oier/p/9454539.html
Copyright © 2011-2022 走看看