美文网首页
2018-06-25常见时间复杂度

2018-06-25常见时间复杂度

作者: 菩灵 | 来源:发表于2018-06-26 20:04 被阅读8次
    常见时间复杂度计算规则
    左边对应于具体应用场合
    12,代表执行12次,抽象为O(1),常数阶
    2n+3,去掉系数抽象为O(n),线性阶
    3n2+2n+1,忽略常数项(1),忽略次要项(2n)等细节问题为O(n2),平方阶
    ……
    常见时间复杂度之间关系

    所消耗的时间从小到大

    O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)
    (记忆方法:可以把n代成8去试)

    Python中算法优劣问题

    *基础操作算一步,基础操作指的是不涉及到函数调用的步骤。


    基础操作

    li.append()调用了append函数,封装了一个函数体,不算作是基本步骤;要去分析函数里面,才能判断复杂度。
    timeit计时器测算,Timer(代码语句,需要用到的东西,时间计量<和操作系统有关>)
    Timer.timeit(number=执行多少次)

    Python列表不同操作的时间效率

    tip1:在设置文件名的时候不要和模块重名,最好前面加入数字序号。
    tip2:Python2中的range直接返回一个列表对象;Python3中的range返回一个可迭代对象;如果Python2也想返回一个可迭代对象,应该用xrange()

    python3:
    >>> range(100)
    range(0, 100)
    >>> type(range(110))
    <class 'range'>
    
    生成列表的几种方法

    *append()只能增加一个元素;extend可以把整个列表追加进去

    测试列表各个方法的时间复杂度
    from timeit import Timer
    
    def t1():
        li = []
        for i in range(10000):
            li.append(i)
    
    def t2():
        li = []
        for i in range(10000):
            li += [i]
    
    def t3():
        li = [i for i in range(10000)]
    
    def t4():
        li = list(range(10000))
    
    def t5():
        li = []
        for i in range(10000):
            li.extend([i])
    
    def t6():
        li = []
        for i in range(10000):
            li.insert(0, i)
    
    
    timer1 = Timer("t1()", "from __main__ import t1")
    print("append", timer1.timeit(1000))
    
    
    timer2 = Timer("t2()", "from __main__ import t2")
    print("+=", timer2.timeit(1000))
    
    
    timer3 = Timer("t3", "from __main__ import t3")
    print("i", timer3.timeit(1000))
    
    timer4 = Timer("t4()", "from __main__ import t4")
    print("range", timer4.timeit(1000))
    
    timer5 = Timer("t5()", "from __main__ import t5")
    print("extend", timer5.timeit(1000))
    
    timer6 = Timer("t6()", "from __main__ import t6")
    print("insert", timer6.timeit(1000))
    
    结果
    append 0.8609376643770416
    += 1.2329407100831602
    i 1.7319727297682164e-05
    range 0.18228948833676695
    extend 1.5933584619055807
    insert 23.403435464130204
    
    Process finished with exit code 0
    

    往尾部添加append比往头部添加insert更快。

    list和dict不能算作基本数据类型,不过是Python封装好了的容器,把基本类型集合起来了。


    list模块中的时间复杂度
    dict模块中的时间复杂度

    注意:extend和“+”哪个比较快的问题;“+=”和“=+”不是一回事,“+=”和extend差不多,针对对象进行累加;“=+”相当于一次次地生成新的对象,进行累加。


    列表中的“+”操作

    list中尽量不要用+,效率太低。

    相关文章

      网友评论

          本文标题:2018-06-25常见时间复杂度

          本文链接:https://www.haomeiwen.com/subject/dwzeyftx.html