数据结构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——栈

 栈特点:先进后出,后进先出

 类的学习

初始化看这里

(19条消息) Python中__init__和self的意义和作用_刘明的博客-CSDN博客_python中__init__的意义以及作用https://blog.csdn.net/fisherming/article/details/93468969整体学习看这里

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算法学习视频,本文仅供个人学习使用,特此声明

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐