zoukankan      html  css  js  c++  java
  • 数据结构与算法(一)

    以一道数学题,引入数据结构与算法,比较运算效率,看懂时间复杂度

    import time
    
    start_time = time.time()
    
    # for a in range(1001):
    #     for b in range(1001):
    #         for c in range(1001):
    #             if 1000 == a + b + c and a**2 + b**2 == c**2:
    #                 print("a, b, c: %d, %d, %d" % (a, b, c))
    # 280.911694
    # 1000 * 1000 * 1000 * 10 = 10 * 1000^3 = T
    
    # T(n) = 10 * n^3   =   O(n^3)
    for a in range(1001):   #  2000
        for b in range(1001):
            c = 1000 - a -b     # 3
            if a**2 + b**2 == c**2:  # 5
                print("a, b, c: %d, %d, %d" % (a, b, c)) # 2
    # 1000 *  1000 *  (3+5+2)   = 10 * 1000^2 = T
    # 时间复杂度  T(n) = 10 * n^2     O(n^2)
    # 基本运算总数 * 基本运算的单位时间
    # cost: 1.838194
    
    end_time = time.time()
    cost = end_time - start_time
    print("cost: %f" % cost)
    
    # li = [1,3,2,7,3,2,4,6]  -> [1, 2, 3, 3, 4,5 6]
    # T(n)
    # [1,2,3,4,5,6,7]

    总的时间=基本运算总数*基本运算的单位时间

    我理解的时间复杂度:算法完成所需要的时间效率

    我理解的空间复杂度:算法完成所需要消耗的存储空间

    我理解的算法复杂度: 时间+空间

    时间复杂度的演变

    基本运算总数--->问题规模N--->函数T(n)--->初始时间复杂度--->大"O"表示法:T(n)=O(n/1/k)

    时间复杂度的分类

    1.最坏时间复杂度 2.最优时间复杂度 3.平均时间复杂度

    时间复杂度的计算规则

    1.常数项---->时间复杂度O(1)

    2.顺序结构---->加法计算

    3.循环结构(倍数关系)---->乘法计算

    4.分支结构:计算( f / else )最大执行次数的时间复杂度

    5.判断算法效率:取最高次项,(次要项和常数项忽略)

    常见的时间复杂度之间的关系

    O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)

    python 内置类型性能分析

    timeit: 通常用timeit模块来测试一小段代码的执行速度

    list内置操作的时间复杂度

    转换list()<推导式[i for]<append()<insert<[ ]+[ ]

    dict内置操作的时间复杂度

    因为以键值对形式存在,值唯一,大部分时间复杂度都为O(1)

    copy和iteration为O(n)

    注意:

    1.同一个算法由于数据的不同,产生的效率也不相同

    2.range(n) :在python3中不会自动生成列表

    什么是算法:解决方法的一种方法和思想

    算法的5大特性:

    1.输入 2.输出 3.有穷性 4.确定性 5.可行性

    什么是数据结构:用于描述数据元素之间的关系

    算法与数据结构的关系:

    用一些方法对这些数据结构的一系列操作,构成程序

    程序 = 数据结构 + 算法

    list,tuple,dict 相当于高级的数据结构

    顺序表(基础的数据结构):

    顺序表的两种形式: 顺序表的基本布局和外置的顺序表

    基本存储单元:1字节=8位

    整型--->需要四个存储单元--->32位

    int a =100-->四个存储单元,地址连续

    list=[100,200,300]---->申请12个存储空间(地址连续)

    存储地址=初始地址*存储空间*下标(n-1)

    为什么下标从0开始:第一个元素的存储地址等于初始地址

    D:截图地址

    字符--->需要一个存储单元--->8位

    list=[100,"a,b","abcde"]

    ​​​​D:截图地址

    存储过程:

    1.将数据元素外置存储在相应的存储空间中

    2.生成这个存储空间的存储地址

    3.将外置的数据元素以储存地址的形式存放在原有的存储空间中

  • 相关阅读:
    StreamBox Ripper 将rm转mp3时候出现g2支持的问题
    网上英语学习资源大整理
    516 find
    怎样使孩子愿意学习
    Oracle日期函数
    Create PR/PO 以后Status的变化
    销售到出仓所经历的表
    UTL_FILE 的用法
    Oracle EBS常用数据表
    我的blog今日开园
  • 原文地址:https://www.cnblogs.com/mengxinfeng/p/12545546.html
Copyright © 2011-2022 走看看