【零基础】学python数据结构与算法笔记8

news2024/11/27 1:40:02

文章目录

  • 前言
  • 46.数据结构介绍
  • 47.列表
  • 48.栈的介绍
  • 49.栈的应用:括号匹配问题
  • 50.队列的介绍
  • 51.队列的实现
  • 52.队列的内置模块
  • 总结


前言

学习python数据结构与算法,学习常用的算法,
b站学习链接

46.数据结构介绍

  • 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该结婚钟数据元素之间的关系组成。
  • 简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中。
  • 比如:列表、集合于字典等都是一种数据结构。
  • 程序= 数据结构+算法

数据结构按照其逻辑结构可分为线性结构、树结构、图结构
线性结构:数据结构的元素存在一对一的相互关系
树结构:数据结构中的元素存在一对多的相互关系
图结构:数据结构中的元素存在多对多的相互关系

图结构就相当于地图 去一个地方可以有好几条路径,也可以是一个地方可以去好几个地方。

47.列表

列表(其他语言称是数组)是一种基本数据类型

先讲一下C语言的数组是怎么实现存储的。
先开一个数组int a[7],代表开辟存7个整型的空间
在这里插入图片描述
比方说第0个位置存1,这个地址是100,
在32位的机器上,一个整数占4个字节(32/8=4)一个字节8位。
(补充:32位的机器最大内存就是4G,因为一共能存储2^32-1=4,294,967,295个bit,是4g=4,294,967,296)
所以第1个位置的地址是104,这里存2,第2个位置是108,存3
那么我查找这个元素是a[2],底层的实现是先找到这个地址100+2*4=108,再从这个位置取出3这个值,所需要的时间复杂度是O(1)

数组和列表有两点不同:
1.数组元素类型要相同
2.数组长度固定。

再说一下python中的列表是如何实现存储的,首先开一个列表[],C语言需要指定它的数组长度而python不需要,可以无限append。(list.append()在列表后追加一个元素)
在这里插入图片描述

而列表里面元素类型可以不相同,因为列表里存的元素是地址,比方说把1存在地址200这个格子里,再把地址200存在列表第0个位置里,2存在地址305里,再把305存在列表第1个位置里。这样列表里的元素就可以是整型,浮点型,不同的元素类型了,1占用200-203,3.1占用12-19,就可以分别占用地址了。
最后列表比方说还是从地址100开始,那么我们取list[2]这个元素时,就可以和C一样,100+2*4,因为i地址都是整型存储了,所以可以找到108的位置是12,这里就比C多了一步,C到这就可以取出3来,而python还要从12这个地址再取出3.1来,存储上是C花销的两倍。
所以python列表的查找操作的时间复杂度是O(1)
删除和插入操作的复杂度呢,在第0个位置删除1,我们需要把它后面的元素全往前一个位置,所以是O(n)。插入也是一样,先把这个位置的后面的元素往后挪一个元素,再插入,时间复杂度也是O(n)

补充:Python垃圾回收机制之小整数对象池
python里的 假设1存在200,2存在305,3存在12 (python内部解释器已经建好了一个固定的小整数池)
a=1 #a指到200的位置
b=1 #b指到200的位置
b=3 #b重新指到12的位置

48.栈的介绍

栈就相当于一叠便利贴,只支持你把便利贴贴上去,或者完成后,把便利贴取下来。
栈(Stack)是一个数据集合,可以理解为智能在一端进行插入或者删除操作的列表。
栈的特点:后进先出LIFO(last-in,first-out)
栈的概念:栈顶、栈底
栈的基本操作:
进栈(压栈):push
出栈:pop
取栈顶:gettop (只是看一下栈顶是什么,不把它丢掉。)

在这里插入图片描述
栈实现:一般使用列表结构就能实现
进栈:li.append
出栈:li.pop
取栈顶:li[-1]
在这里插入图片描述

49.栈的应用:括号匹配问题

括号匹配问题:给一个字符串,其中包含小括号、中括号、大括号,求该字符中的括号是否匹配
例如:
()()[]{} 匹配
({{[]}})匹配
[]( 不匹配
{(})
思路:
用栈的思想,一个一个遍历字符,如果是左边的括号,就进栈,如果栈顶和遍历的字符匹配,就出栈。最后当栈内没有元素就说明括号是匹配的,否则不匹配。
在这里插入图片描述

50.队列的介绍

队列(Queue)是一个数据集合,仅允许在列表的一端进行插入,另一端进行删除。
进行插入的一端称为队尾(rear),插入动作称为进队或者入队
进行删除的一端称为队头(front),删除动作称为出队
队列的性质:先进先出(First-in,First-out)

就可以看作成现实生活中的排队
在这里插入图片描述
尝试用列表简单建立队列,发现列表的出队pop是O(n)的复杂度,会将队伍往前挪一个位置,入队append是在队尾再加一个元素,rear指针往后挪一个位置。实现起来复杂度太高了。
可以用环形队列的实现方式。
环形队列:当队尾或者队首指针 ==MaxSize -1时,再前进一个位置时,就自动到0
队空时:rear == front
进队时:队尾指针前进1 :rear = (rear + 1)%MaxSize 这里就是12
出队时:队首指针前进1:front = (front+1) %MaxSize (取余的操作刚好构成了一个环形)
队满时:(rear+1)%MaxSize ==front (因为如果不空一个,就会使得rear == front 无法判断队空还是队满,当rear为11,front=0时,real+1 不等于front,但是达到了队满,所以加上%MaxSize)

在这里插入图片描述

51.队列的实现

队列创建列表,大小为5,当4个有值时说明满了。
在这里插入图片描述
有0 1 2 3 4 五个位置,front和rear首先都指向0,先入队0,1,2,3 四个值,入队时,先将rear指向1,在1这个位置存0,然后2位置存1 ,3位置存2 ,4位置存3,现在本来00000,变成00123,然后出队列,把front指向位置1,返回在位置1上的值,是0。
在这里插入图片描述
虽然位置0上还有值,但是我们已经不care它是多少了,它会被后来的入队给覆盖掉,就相当于是删除了。最后在队列为空时不能出队,队列为满时不能入队做一个边界判断。

52.队列的内置模块

使用方法:from collections import deque
双向队列:(两边都可以进队,出队)
创建队列: queue= deque()
进队:append()
出队:popleft()
双向队列队首进队:qppendleft()
双向队列队尾出队:pop()

内置的队列,有个特点,当队满时,踢出第一个,所以这里入队了6,保持队伍长度为5,[2,3,4,5,6],再popleft时,就是2出队
在这里插入图片描述
然后队首进队1,队尾出6,队列为deque([1, 3, 4, 5])
在这里插入图片描述
用队列来实现linux的tail命令,tail -n 8 ,就是打印文件的后8行。借用一下别人的图。

在这里插入图片描述
先随便写10行,名叫test.txt,放在.py的同目录下。
在这里插入图片描述yuan
原理和刚刚一样,队满时,踢出第一个,将最后一个放入,保持队列为5个元素,所以最后就是后5个元素。
在这里插入图片描述
打印一下,因为python打印会自动换行,不让它自动换行,加end=“”
在这里插入图片描述

总结

学习了基础的数据结构,列表,栈,队列。

文章目录

  • 前言
  • 46.数据结构介绍
  • 47.列表
  • 48.栈的介绍
  • 49.栈的应用:括号匹配问题
  • 50.队列的介绍
  • 51.队列的实现
  • 52.队列的内置模块
  • 总结


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/153632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

双点双向重发布以及路由策略

目录前言实验要求基础配置启动rip 及 ospf 协议双向重发布路由策略前言 1,由于ASBR在重发布路由条目时,将清除原有协议携带的度量,会添加新协议的度量种子,一旦2,使用双点双向重发布时,可能会出现选路不佳…

docker容器日志清理

最近发现linux(Centos 7)虚拟机的空间不够了,想创建新的容器都失败。剩下不到100M。之前还有好几个G。然后每天不定期查看磁盘空间,发现不断被蚕食。今天比昨天就少了100M;然后下午比上午又少了50M。谁在吞噬服务器的硬…

Nacos学习之使用Nacos作为配置中心

使用Nacos作为配置中心 简单使用 1、导入依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-nacos-config</artifactId></dependency>2、创建bootstrap.properties文件&#xff0c;在其中对nacos…

Vulnhub靶机:MATRIX-BREAKOUT_ 2 MORPHEUS

目录介绍信息收集主机发现主机信息探测网站探测目录爆破反弹shell提权Flag1内核提权 & Flag2介绍 系列&#xff1a;Matrix-Breakout&#xff08;此系列共1台&#xff09; 发布日期&#xff1a;2022 年 7 月 11 日 难度&#xff1a;中级 运行环境&#xff1a;Virtualbox运行…

快速搭建ChatGPT的AI聊天QQ机器人[含问题解决办法]

一、cqhttp 1. 下载cqhttp 首先安装 cqhttp 框架&#xff0c;我们从 release 界面下载最新版本的 go-cqhttp&#xff0c;需要根据不同的系统选择不同的文件 我目前是mac系统&#xff0c;暂时仅举例macOs Intel 版 Macos&#xff1a; go-cqhttp_darwin_amd64.tar.gz 2. 启动 …

jvm运行过程

VM是Java程序运行的环境,同时是一个操作系统的一个应用程序进程,因此它有自己的生命周期,也有自己的代码和数据空间. JVM体系主要是两个JVM的内部体系结构分为三个子系统和两大组件&#xff0c;分别是&#xff1a;类装载器&#xff08;ClassLoader&#xff09;子系统、执行引擎…

5.1、运输层概述

之前所介绍的计算机网络体系结构中的物理层、数据链路层以及网络层它们共同解决了将主机通过异构网络互联起来所面临的问题&#xff0c;实现了主机到主机的通信\color{red}实现了主机到主机的通信实现了主机到主机的通信。 网络层的作用范围主机到主机 但实际上在计算机网络中…

帮助聊天回复的软件

在线客服在工作时&#xff0c;时常能遇到在某一个时间段一大批客户集中咨询的情况&#xff0c;使用客服快速回复软件能够使客服在第一时间进行高效的回复。 前言 在线客服在工作时&#xff0c;时常能遇到在某一个时间段一大批客户集中咨询的情况&#xff0c;通常这种情况下也是…

P2010 [NOIP2016 普及组] 回文日期————C++

题目 [NOIP2016 普及组] 回文日期 题目背景 NOIP2016 普及组 T2 题目描述 在日常生活中&#xff0c;通过年、月、日这三个要素可以表示出一个唯一确定的日期。 牛牛习惯用 888 位数字表示一个日期&#xff0c;其中&#xff0c;前 444 位代表年份&#xff0c;接下来 222 位…

算法测试中的召回率和精确率详解

基本概念 TP&#xff08;True Positive&#xff09;&#xff1a;正确的正例&#xff0c;一个实例是正类并且也被判定成正类FN&#xff08;False Negative&#xff09;&#xff1a;错误的反例&#xff0c;漏报&#xff0c;本为正类但判定为假类FP&#xff08;False Positive&am…

基于 java springboot+mybatis二手物品网站系统设计和实现

基于 java springbootmybatis二手物品网站系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获…

linux系统中QT里面多线程的使用方法

大家好&#xff0c;今天主要和大脚聊一聊&#xff0c;如何使用QT中的多线程的方法。 第一&#xff1a;多线程基本简介 QThread 线程类是实现多线程的核心类。Qt 有两种多线程的方法&#xff0c;其中一种是继承 QThread 的 run()函数&#xff0c;另外一种是把一个继承于 QObject…

Excel教程

目录 1.设置Excel界面以及保存Excel 1.1 自定义快速访问工具栏 1.2 自定义功能区的使用 1.2.1 自定义选项卡 1.3 自定义页面 1.4 保存时设置文件密码 2.常用的高效操作 2.1 快速填充 2.1.1 快速填充实现拆分重组 2.2 快速分析数据 2.2.1 格式化​编辑 2.2.2 图表&#xff0c…

yolov5 引入RepVGG模型结构

&#xff08;一&#xff09;前情 这个工作已经有大佬用在自己的工程里了&#xff0c;他的帖子链接&#xff1a;https://blog.csdn.net/weixin_45829462/article/details/120372921 但他的这个lite主要不是研究repvgg的&#xff0c;是做移动端的&#xff0c;但是里面加了这个re…

【BP靶场portswigger-服务端8】文件上传漏洞-7个实验(全)

前言&#xff1a; 介绍&#xff1a; 博主&#xff1a;网络安全领域狂热爱好者&#xff08;承诺在CSDN永久无偿分享文章&#xff09;。 殊荣&#xff1a;CSDN网络安全领域优质创作者&#xff0c;2022年双十一业务安全保卫战-某厂第一名&#xff0c;某厂特邀数字业务安全研究员&…

Linux应用编程---13.网络编程

Linux应用编程—13.网络编程 ​ 网络编程要熟悉一些计算机网络有关的名词&#xff0c;可以先做了解&#xff0c;后续实际开发在深入研究&#xff0c;自上而下学习。与本次Linux应用编程有关的就是TCP与UDP协议。简明概念如下图1所示。 图1 计算机网络体系结构 ​ 前面学习的进…

数控机床各种加工模式以及英文简写

AUTO&#xff08;自动模式&#xff09; 机床自动运行加工程序&#xff0c;对零件进行加工。前提是所编的程序经过试验后是可行的&#xff0c;而且是加工出来的件经过检验后是合格的&#xff0c;才可以使用该程序。 EDIT&#xff08;编辑模式&#xff09; 在此模式下&#xff…

Spring Boot集成第三方登录之微博登录

准备工作 微博开放平台&#xff1a;https://open.weibo.com/ 网站接入 登陆微博开放平台&#xff0c;进入微连接&#xff0c;选择网站接入 点击立即接入 开发者信息认证 填写开发者信息与身份认证信息 创建应用 开发者信息认证通过后即可创建应用。 应用创建成功后会得到app …

哪种台灯质量好又实惠?性价比最高的护眼台灯

l 只要台灯质量过关就是及格的第一步&#xff0c;首先就是有3C质量认证&#xff0c;符合国A或国AA照度标准。l 显色也会是很重要的&#xff0c;光源品质高的产品&#xff0c;显色性不会低于Ra90的&#xff0c;太阳光的显色指数&#xff1d;100&#xff0c;那么意味着显色指数越…

一文详解Paramiko安装与使用

项目要求 定期向特定服务器传输软件运行状况文件&#xff08;基于SFTP&#xff09;&#xff0c;因此计划写一个Python脚本&#xff0c;该脚本首先要定期读取产品运营数据&#xff0c;然后按要求生成数据文件&#xff0c;最后通过 Paramiko 上传到SFTP服务器。 这篇文章是我在实…