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)

  • 相关阅读:
    DropDownList控件的AutoPostBack属性的问题 选择后,值也跟着刷新 Kenny
    window showModalDialog 在IE6 IE7 高度(height) 问题 Kenny
    discuz初玩之一 未将对象引用设置到对象的实例(Discuz.Forum.HttpModule.ReUrl_BeginRequest) Kenny
    最长公共子串问题 LCS
    HDOJ 1024
    项目一周工作总结
    DartCloud技术难点、问题及经验教训
    中国云项目遇到的问题
    我的计算机书单
    翻转句子中单词的顺序 面试题
  • 原文地址:https://www.cnblogs.com/nerdlerss/p/5628733.html
Copyright © 2011-2022 走看看