您的位置:首页 > 其它

有关时间复杂度的计算

2017-10-22 23:03 239 查看
有关时间复杂度的计算

时间复杂度:执行的次数和问题规模之间的函数关系。

1.计算规则:(1)只考虑高阶项,低阶项直接丢弃;(2)系数不要。

2.常见的时间复杂度:增长率由小到大为:

常数阶O(1),  对数阶O(log2n),  线性阶O(n),  线性对数阶O(nlog2n),  平方阶O(n^2), 立方阶O(n^3),..., k次方阶O(n^k), 指数阶O(2^n),  阶乘O(n!)。

如果一个算法的复杂度为常量 、 log2n 、n 、 n*log2n,那么这个算法时间效率比较高 ,如果是 2n , 3n ,n!,那么稍微大一些的n就会令这个算法不能动了,居于中间的几个则差强人意。

3.举例:

(1)O(1)

    Temp=i;

    i=j;

    j=temp;    

    //执行的次数和问题规模n无关

(2)O(n)

    void Fun(int n)

    {

        if(n<1)

            return 1;

        else

            return Fun(n-2)+1;

    }

    //循环了n+(n-2)+(n-4)+(n-6)+……+1 不考虑系数n/2,所以是O(n)

(3)O(log2n)

    void Fun(int n)

    {

        if(n<1)

            return 1;

        else

            return Fun(n/2)+1;

    }

    //循环了n+(n/2)+(n/4)+(n/6)+……+1 2^x=n x=log2n,所以是O(log2n)

    

(4)O(n2)

 (a)for(i=1;i<=n;i++)    //循环了n*n次,是O(n^2)

        for(j=1;j<=n;j++)

            s++;

            

 (b)for(i=1;i<=n;i++)    //循环了(n+n-1+n-2+...+1)≈(n^2)/2,因为时间复杂度是不考虑系数的,所以也是O(n^2)

        for(j=i;j<=n;j++)

            s++;

            

 (c)for(i=1;i<=n;i++)    //循环了(1+2+3+...+n)≈(n^2)/2,当然也是O(n^2)

        for(j=1;j<=i;j++)

            s++;

            

(5)for(i=1;i<=n;i++)

        for(j=1;j<=i;j++)

            for(k=1;k<=j;k++)

                x=x+1;

    //循环了(1^2+2^2+3^2+...+n^2)=n(n+1)(2n+1)/6 ≈ (n^3)/3,不考虑系数,自然是O(n^3)

另外,在时间复杂度中,log(2,n)(以2为底)与lg(n)(以10为底)是等价的,因为对数换底公式log(a,b)=log(c,b)/log(c,a)

所以,log(2,n)=log(2,10)*lg(n),忽略掉系数,二者当然是等价的

4.渐近时间复杂度

时间复杂度是某个算法的时间耗费,它是该算法所求解问题规模n的函数;

而渐进时间复杂度是指当问题规模趋向无穷大时,该算法时间复杂度的数量级。

例题:设三个函数f,g,h分别为 f(n)=100n^3+n^2+1000 , g(n)=25n^3+5000n^2 , h(n)=n^1.5+5000nlgn

请判断下列关系是否成立:

(1) f(n)=O(g(n))

(2) g(n)=O(f(n))

(3) h(n)=O(n^1.5)

(4) h(n)=O(nlgn)
渐近时间复杂度的表示法T(n)=O(f(n)),这里的"O"是数学符号,它的严格定义是"若T(n)和f(n)是定义在正整数集合上的 两个函数,则T(n)=O(f(n))表示存在正的常数C和n0 ,使得当n≥n0时都满足0≤T(n)≤C?f(n)。"

简单来说就是这两个函数当整型自变量n趋向于无穷大时,两者的比值是一个不等于0的常 数。(即两个函数的增长率相等,即最高项的指数相同)

◆(1)成立。题中由于两个函数的最高次项都是n^3,因此当n→∞时,两个函数的比值是一个常数,所以这个关系式是成立的。

◆(2)成立。与上同理。

◆(3)成立。与上同理。
◆(4)不成立。由于当n→∞时n^1.5比nlgn递增的快,所以h(n)与nlgn的比值不是常数,故不成立。

以上是比较常用的情况,以后学习完更多复杂情况,再来完善这篇博客。

----------------------------------------------------------------------------------------------

参考资料:
http://blog.csdn.net/firefly_2002/article/details/8008987 http://univasity.iteye.com/blog/1164707 http://blog.csdn.net/zhuchzhi/article/details/1529514
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: