zoukankan      html  css  js  c++  java
  • 时间复杂度入门

    时间复杂度: 

    常用的时间复杂度有:常数级,对数级,线性级 线性对数级 平方级,立方级别,多项式级别,指数级别,阶乘级别

    这里我们主要探讨对数级,线性级,平方级,指数级---为什么不讨论其他的?别的我也不会啊--- 囧 

    f(x)  ε O(n*n):这里指的是f这个函数的增长速度 不会以后n*n快 这里的x指的是特定的输入 

    用n来估算x的范围大小

    我们先写一段代码。QAQ:

    def exp1(a,b):
        ans =1
        while(b>0):
            ans *=a
            b -=1
        return ans
    

    这个方法是求 a的b次方的值 ?那么如果b=10 做了多少次操作呢  3b+2 也就是32次 那么我们可以得出

    f(x)  ε O(3b+2) 但是2好像是不会变的,当数值变大时2就没有意思 所以f(x)  ε O(3b) 当然他就是线性的 我们都写错O(n) ----这就是所谓的线性级

    我们在来看看下面的代码:

    def exp2(a,b):
        if b == 1:
            return  a
        else:return a*exp2(a ,b-1)
    print exp2(2,3)
    

      这里我们用的是递归,同样的我们来看看这个函数执行数跟参数的关系:

    t(b) = 3+t(b-1) --->t(b) = 3+3+t(b-2)    我们找到规律就是  t(b) = 3*k+t(b-k) --这里的k 是我们添加的参数

    我们知道当b-k=1 的时候就结束了 那么 k = b-1 上述方程式:结果为 3b-2 那么 f(x) ε O(3b-2)也是线性的

    那么接着看下面的代码:

    def exp3(a,b):
        if b == 1:
            return a
        if (b/2)*2 ==b:
            return exp3(a*a,b/2)
        else:
            return a*exp2(a ,b-1)
    

      我们在这里做了小小的性能优化 ,如果我们求的是 偶数次方 我们知道 a的4次方等于 a*a的平方

    t(b)= 6+t(b/2)--->6+6+t(b/2*2)--->6+6+6+t(b/2*2*2)---6*k+t(b/2的k次方) 我们知道当b/2的k次方=1的时候结束 那么k = log2 b 也就是 O(log)--这里就是对数级

    接下来我们看看轻松的

    def exp4(a,b):
        x = 0
        for i in range(a):
            for i range(b):
                x+=1
    
        return x
    

    很明显 t(b)=(a*b) 也就是O(a*b)---平方级

    最后我们来看下指数级: 也许是你最不想看到的情况:

    def Towers(size,fromStack,toStack,spareStack):
        if size == 1:
            print "Move disk from ",fromStack, "to" ,toStack
        else:
            Towers(size-1,fromStack,spareStack,toStack)
            Towers(1,fromStack,toStack,spareStack)
            Towers(size-1,spareStack,toStack,fromStack)
               
    

      t(b) = 3+2*t(b-1)--->3+3*2+4*t(b-2)-->1*3+2*3+4*3+8*(b-3)

        --->3(1+2+4+...2^k-1) +2^k*(b-k)---->O(2^n)

  • 相关阅读:
    poj 3528 (三维几何求凸包+凸包表面积)
    dijkstra模板(好像是斐波那契额堆优化,但我为什么看起来像优先队列优化,和spfa一样)
    最大空凸包模板
    ICPC 2017–2018, NEERC, Northern Subregional Contest St Petersburg, November 4, 2017 I题
    hdu 5248 序列变换
    hdu 2063(二分图模板测试)
    组合数
    85. Maximal Rectangle 由1拼出的最大矩形
    750. Number Of Corner Rectangles四周是点的矩形个数
    801. Minimum Swaps To Make Sequences Increasing 为使两个数组严格递增,所需要的最小交换次数
  • 原文地址:https://www.cnblogs.com/nerdlerss/p/5628733.html
Copyright © 2011-2022 走看看