数据结构1——列表
需要研究列表的以下几个问题:
python列表和c++数组对比:
1.数组元素类型必须相同,列表可以不同
2.数组长度固定,列表长度超过时系统帮你添加
在32位机上一个整数占32位,即4字节(64位机上就是8字节,同理)
如下图(不知道看得到否),假设c++数组中a[0]位置的元素是100,那么a[2]位置的元素为100+4*1=104,但是python列表是跳跃的比如列表中第一个元素对应计算机中100,第二个对应305,第三个对应12,这里的100,305,12叫地址,根据地址存储相当于把不同类型的数据转为地址,查找时先找到100+2*4=108,在找到108对应的地址12,找到地址对应元素3.1,就是多了地址查找这一步,但解决不同类型数据问题。
解决数组长度添加问题,是系统发现没有位置后,新建一个列表(比原来长度大一倍或大一些(有套自己的算法)),然后把原来的给copy过来,再在新列表中添加。
储存问题:列表又叫顺序表,通过连续的内存储存
各操作时间复杂度:
查找:O(1)
添加append:O(1)
插入insert、删除pop/remove:O(n)(后面元素都要移动)
数据结构2——栈
栈特点:先进后出,后进先出
类的学习
初始化看这里
Python入门 类class 基础篇 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/30024792
class Stack:
def __init__(self):
self.stack=[]
def push (self,element):
self.stack.append(element)
def pop(self):
return self.stack.pop()
def get_top(self):
if len(self.stack)>0:
return self.stack[-1]
else:
return None
stack=Stack()
stack.push(1)
stack.push(2)
stack.push(3)
print(stack.get_top())
栈的应用——括号匹配问题
假设这种(){[()[{}]]}
1.(进栈,)和栈顶比较,匹配,(出栈
2.{进栈,[进栈,(进栈,)与栈顶比较匹配出栈,[进栈,{进栈,}与栈顶元素匹配,{出栈,后同
结果能完全匹配的条件:
1.读完了且都能匹配
2.读完时栈是空的
算法实现
class Stack:
def __init__(self):
self.stack=[]
def push (self,element):
self.stack.append(element)
def pop(self):
return self.stack.pop()
def get_top(self):
if len(self.stack)>0:
return self.stack[-1]
else:
return None
def is_empty(self):
return len(self.stack)==0
def match(s):
match={"]":"[","}":"{",")":"("}
stack=Stack()
for ch in s:
if ch in {"(","[","{"}:#集合
stack.push(ch)
else:
if stack.is_empty():
return False
elif stack.get_top()==match[ch]:
stack.pop()
else:#不等于
return False
if stack.is_empty():
return True
else:
return False
print(match('[]{()[()[]]}'))
print(match('[(]])'))
结果展示
数据结构3—— 队列
队列特点:先进先出FIFO
队列运用简单列表会出现内存冗余或pop时间复杂度太高的问题
引入环形队列
空队列判定:rear==front
队满为了和空队列区分规定为(rear+1)%12(队列大小)==front
任何时刻rear指向最后一个数(空队列除外)而front不指向任何数
双向队列与python自带的队列内置模块
deque([1,2,3],5)用于创建空队列 【1,2,3】是既有的元素,5用于设置最大长度,超出即leftpop,可以用于读取文件最后几行的功能
部分图片参考自b站IT编程界的扛把子的python算法学习视频,本文仅供个人学习使用,特此声明