时间复杂度入门

时间复杂度: 

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

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

 

 

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)

 

posted @ 2016-06-30 01:54  nerdlerss  阅读(286)  评论(0编辑  收藏  举报