day18

1. 数据结构介绍

概念

​ 计算机学科基本概念,有助于对编程语言程序执行效率的提高

运算分类

​ 存放在容器中的数据需要执行的数据结构操作如下:

  • 遍历: 逐个打印所有元素
  • 插入:在特定位置添加一个元素
  • 删除:删除特定位置的元素
  • 搜索:根据给定索引或者值对整个数据结构进行检索
  • 更新:更新给定元素

常见数据结构

  • 字符串
  • 列表
  • 字典
  • 链表
  • 队列
  • 二叉树

2. 数据结构算法

2.1 数组模块

'''
数组:
    arrary
    
    array(typecode [, initializer]) -> array
    typecode:兼容C语言
    b   代表大小1个字节有符号整数
    B   代表大小1个字节无符号整数
    c   代表1个字节的字符
    i   代表大小2个字节有符号整数
    I   代表大小2个字节无符号整数
    f   代表大小4个字节的浮点数
    d   代表大小8个字节的浮点数
'''
from array import *
# 创建数组对象
arrary1 = array('i',[1,2,3,4,5])

print(type(arrary1))
# 遍历
for element in arrary1:
    print(element, end='\t')
print()
# 访问特定元素
print(arrary1[0], arrary1[len(arrary1)-1])
# 插入元素 .insert(pos,val)
arrary1.insert(1, 11)
for i in arrary1:
    print(i,end='\t')
print()
# 删除元素 .remove(val),只允许传入一个值
arrary1.remove(11)
for i in arrary1:
    print(i,end='\t')
print()

# 查询,index(val)返回下标
print(arrary1.index(1))

# 更新特定位置元素
arrary1[0] = 100
print(arrary1[0])

2.2 列表

'''
datalist = [10,20,30,40,50]
遍历、插值、搜索、删除、更新
'''

# 创建
datalist = [10,20,30,40,50]

# 遍历
for i in datalist:
    print(i)

# 插值
datalist.insert(0,0)

# 搜索
datalist.index(20)

# 删除
del datalist[0]

# 更新
datalist[0] = 1000

2.3 元组

# 创建
dataTuple = (10,20,30,40,50)
# 遍历
for i in dataTuple:
    print(i)
# 元组内部数据不可修改,但是可更新
dataTuple2 = ('abc','xyz')
dataTuple+=dataTuple2
print(dataTuple)
# 删除:删除整体数据结构
del dataTuple

2.4 字典


dataDict = {
    'name':'Alex',
    'age':23,
    'class':'python'
}
# 遍历:key值, value值,(keyval)
for key in dataDict.keys():
    print(key,end='\t')
print()
for value in dataDict.values():
    print(value,end='\t')
print()
for kv in dataDict.items():
    print(kv)
print()
# 插值
dataDict['height'] = 1.414
print(dataDict)
# 删除:1. pop删除key,del以及clear
dataDict.pop('height')
del dataDict['class']
print(dataDict)
dataDict.clear()
print(dataDict)
# 更新:key重新赋值value,update添加数据
dataDict['name'] = 'John'
dataDict.update({'class': 'python'})
print(dataDict)

2.5 二维列表

# 创建
dataList2 = [
    [1,2,3],
    [1,1,1],
    [11,22,33]
]
# 遍历
for row in dataList2:
    for col in row:
        print(col,end='\t')
    print()
# 插值
dataList2.insert(1,['a','b','c'])
print(dataList2[1])
# 更新
dataList2[2][0] = 99
# 删除
del dataList2[1]
print(dataList2)

2.6 集合


'''
创建、访问元素、添加、删除
'''
Weeks = set(['Mon','Tue','Wen','Thu','Fri'])
# 访问
for day in Weeks:
    print(day,end='\t')
print()
# 添加
Weeks.add('Sat')
print(Weeks)
# 删除
Weeks.remove('Sat')
print(Weeks)

2.7 矩阵

numpy库实现矩阵创建

from numpy import *
# Arrary:矩阵操作
data1 = array([1,2,3,4,5,6,7,8,8,7,6,5,4,3,2,1])
# reshape方法可以将arrary对象实现矩阵转换:转二维
data2 = data1.reshape((2,8))
print('一维:',data1)
print('二维:',data2)
# 三维矩阵
data3 = data1.reshape((2,2,4))
print('三维:',data3)
data4 = data1.reshape((2,4,2))
print('三维:',data4)
'''
一维: [1 2 3 4 5 6 7 8 8 7 6 5 4 3 2 1]
二维: [[1 2 3 4 5 6 7 8]
 [8 7 6 5 4 3 2 1]]
三维: [[[1 2 3 4]
  [5 6 7 8]]

 [[8 7 6 5]
  [4 3 2 1]]]
三维: [[[1 2]
  [3 4]
  [5 6]
  [7 8]]

 [[8 7]
  [6 5]
  [4 3]
  [2 1]]]

'''
from numpy import *

dataList2 = [
    [1,2,3],
    [1,1,1],
    [11,22,33]
]
# 通过二维列表创建矩阵
NumpyArrary= array(dataList2)
# 访问矩阵
print(NumpyArrary)
# 访问矩阵元素
print(NumpyArrary[2])
print(NumpyArrary[2][0])
# 增加元素: numpy.insert(arrary, pos, value, axis)
# axis=0: 行, axis =1:列
NewArrary= insert(NumpyArrary,3,[1,2,3], axis=1)
print('NumpyArrary:',NumpyArrary)
print('NewArrary:',NewArrary)
# 删除元素:numpy.delete(arrary, pos, axis)
DelArrary = delete(NewArrary, 1, axis=1)
print('DelArrary:',DelArrary)
# 更新某一行
NewArrary[2] = [0,0,0,0]
print(NewArrary)
'''
[[ 1  2  3]
 [ 1  1  1]
 [11 22 33]]
[11 22 33]
11
NumpyArrary: [[ 1  2  3]
 [ 1  1  1]
 [11 22 33]]
NewArrary: [[ 1  2  3  1]
 [ 1  1  1  2]
 [11 22 33  3]]
DelArrary: [[ 1  3  1]
 [ 1  1  2]
 [11 33  3]]
[[1 2 3 1]
 [1 1 1 2]
 [0 0 0 0]]
'''

3. 数据结构类型

  1. 线性结构: 数据结构中每个元素按照熟悉怒进行排序,除了第一个元素之外,每个元素都有唯一个前驱,除了最后一个元素,每个成员都有唯一后继(购物车清单,排队系统)

  2. 层级结构:这类结构相当于一颗颠倒过来的树。除了最顶端的第一项,每个数据项都具有一个前驱-可称为父亲,但是这个数据项可以具备多个后继项-可称为孩子,应用:磁盘文件管理系统

  3. 图:每一项都可能有前驱或后继: 地图软件、路网系统或电网系统

  4. 无序集合:数据结构中成员无特定顺序-set()

4. 算法复杂度分析

算法评估标准

  • 正确
  • 良好可读性、可维护性
  • 运算时间
  • 空间占用-内存

时间度量算法

import time

limitNum = 1000
print('%12s%16s'%('运算规模','执行时间'))
for count in range(5):
    startTime = time.time()
    work = 1
    for x in range(limitNum):
        # work+=1
        # work-=1
        for y in range(limitNum):
            work+=1
            work-=1
    stepTime = time.time() - startTime
    print('%12d%16f'%(limitNum, stepTime))
    limitNum**=2
  • 运算规模翻倍后,执行时间也会翻倍

    • 降低时间复杂度,通过增加运算规模来(进程、线程并发)
    • 搭建高性能服务器:cpu、内存
  • 复杂度表示方法:大O表示法

    • 使用Of(n)
      • n: 算法大小
      • f(n): 要解决问题所需的工作量

4.1 时间复杂度

# O(1)
print('hello world!')
print('hello world!')
print('hello world!')

# O(n)
for i in range(n):
    print('hello world!')

# O(n**2)
for i in range(n):
    for j in range(n):
        print('hello world!')
# O(n**3)
for i in range(n):
    for j in range(n):
        for k in range(n):
            print('hello world!')

'''
几次循环就是n的几次方时间复杂度
'''
n = 64
while n>1:
    print(n)
    n = n//2
'''
2**6 = 64, log2 64 == 6, 所以循环减半时间复杂度O(log2 n) 或 O(logn)
'''
  • 常见时间复杂度排序

    O(1)<O(log n)< O(n)<O(nlog n)<O(n**2)<O(n**2log n)< O(n**3)

4.2 空间复杂度

空间复杂度

​ 用来评估算法内存占用大小公式

a = 'python' # 空间复杂度1

# 空间复杂度为1的例子
b = 'PHP'
c = 'Java'

num = [1,2,3,4,5] # 空间复杂度5
# 空间复杂度 5*4
num = [[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]]
# 空间复杂度 3*2*2
num = [[[1,2][1,2]],[[1,2][1,2]],[[1,2][1,2]]]

# 定义一个或多个变量空间复杂度为1,列表的空间复杂度为列表长度
  • 练习:

    • 使用random模块生成整数(0-100),列表randomList 存放20个元素
    • 升序输出列表
    def genList(L, num, min,max):
        for i in range(num):
        	L.append(random.randint(min,max))
        return L
    

5. 常见排序

  • 比较排序

    • 在没有排序的序列中找到最小或最大的元素,存放到序列的起始位置
    • 再从剩余部分序列中继续寻找最小值或最大值,以此类推
    def orderCmp(L):
    	pass
    L = []
    orderCmp(genList(L,20,0,100))
    
    # 从现有列表中找到最大值
    List = [1,10,9,2,3]
    # 列表的第一位存放整个列表中最大的元素
    for i in range(1, len(List)):
        if List[0]<List[i]:
            List[0],List[i] = List[i],List[0]
    print(List[0])
    
    # 列表的第一位存放整个列表中最大的元素
    def orderCmp(List):
        for j in range(len(List)-1):
            for i in range(j+1, len(List)):
                if List[j]< List[i]:
                    List[j],List[i] = List[i],List[j]
        return List
    
    if __name__ == '__main__':
        List = [1, 10, 9, 2, 3]
        print(orderCmp(List))
    
  • 冒泡排序

冒泡

  • 重复的遍历序列,一次完成相邻两个元素的比较,如果不符合规则-进行位置交换
  • 遍历这个序列直到没有元素可以进行交换代表冒泡排序完成。
Lis = [1,10,9,2,3]
# 第一轮排序:第一个值 第二个值。 比较较大值-放到序列最后位置
List[0],List[1]  #不重新排序
List[1],List[2]  #颠倒次序
....
for i in range(len(lis)):
   for j in range(len(lis)-i-1):
       if lis[j]>lis[j+1]:
           lis[j],lis[j+1]=lis[j+1],lis[j]
print(lis)

:

  List = [1, 10, 9, 2, 3]
  print(orderCmp(List))
  • 冒泡排序

冒泡

  • 重复的遍历序列,一次完成相邻两个元素的比较,如果不符合规则-进行位置交换
  • 遍历这个序列直到没有元素可以进行交换代表冒泡排序完成。
Lis = [1,10,9,2,3]
# 第一轮排序:第一个值 第二个值。 比较较大值-放到序列最后位置
List[0],List[1]  #不重新排序
List[1],List[2]  #颠倒次序
....
for i in range(len(lis)):
   for j in range(len(lis)-i-1):
       if lis[j]>lis[j+1]:
           lis[j],lis[j+1]=lis[j+1],lis[j]
print(lis)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值