数据结构与算法之Python实现——线性表(一)

news/2024/5/4 18:36:55/文章来源:https://blog.csdn.net/weixin_62917800/article/details/127335541

🐳 前言

数据结构与算法的一刷是在前几个月的时候用C语言区实现的,那时候也刚开始接触C语言,只知道个C语言的大概,然后却不怎么会应用。

之后在网上买了一本数据结构的书后就开始用C语言去学习。在用C语言去学习的过程中,是十分痛苦的,很多概念都十分抽象,也只有自己想方设法地去理解。但收获也是颇丰,用了几个月硬生生把它啃下来后,也的的确确发现自己对C语言的理解和应用更上一层楼。

但在后面接触python后,我又发现自己对数据结构与算法的学习仅仅停留在C语言的基础上。在我想用python写代码时,常常无从下手,去翻阅别人的博客后,也只能理解个大概,从写代码上来说还是不太行。

于是一直指导我的一位大佬建议我再用python去刷一遍数据结构,告诉我数据结构与算法不是只局限在某个语言之上,它锻炼的是我们的底层思维逻辑和用代码解决实际问题的能力。

数据结构与算法的出现,是针对于解决某些具体的问题,而通过问题寻找解答方法的这种思路正是我们要学习的。

对于一个具体的问题,我们知道怎么解决是一回事,如何用代码去解决又是另一回事。所以这就要求对计算机语言有较高的熟悉度和基于计算机语言的逻辑思维。(说个题外话,因为大二有一门概率论与数理统计的课程,所以之前指导我的那个大佬叫我用C语言去实现这门课的一些试题,大家有兴趣的话可以看一看C语言实现概率论与数理统计)

在此,我会用博客来记录用python实现数据结构与算法的学习过程,希望大家多多支持

🐳 理解线性表

什么是线性表?或者说什么是线性?

线性可以理解为“线”的性质,也就是说线性就类似于“一条线”的性质。通过这条线,将一个一个数据连接起来,每个数据与数据之间的关系一定是前后关系,意思是一个数据只能在另一个数据的前面或者后面,不能在其它位置,此即线性表。

线性表又可以进一步细分为两种——顺序表和链表。请看下图区别👇:

在这里插入图片描述
顺序表是一体式结构,就是说将数据一起存放在一个大的“整体”中。

链表就是通过某种方式将数据链接起来,这里的有向线段是为了突出它们的前后关系。

下面先对顺序表作具体说明(关于链表的类型和操作较多,所以在下一条博客中整理出来)👇:

🐳 顺序表

在Python中我们用list数据类型来作为“线性表”,为什么?

  • list类型中数据间只有前后关系
  • list可变,可对其中的数据进行增删改等操作

像元组(它不支持改变其每部状态的任何操作)就不满足上述第二个条件,所以元组不能用作为线性表。

🐋 顺序表的一些主要操作

🐬 初始化
🐬 载入数据
🐬 添加元素
🐬 删除元素
🐬 判断表中位置是否已满
🐬 查找某个数据在表中的位置
🐬 扩大表空间

先看总代码👇

class SqList:# 初始化def __init__(self,MaxSize):                 # MaxSize为表的最大空间self.MaxSize = MaxSizeself.size = 0                           # 当前表的数据量self.data = [None] * self.MaxSize       # 存储表中的数据# 加载数据def load(self,Elem):                        # 传入一个list,Elem是传入list的名if len(Elem) > self.MaxSize:            # 判断list的长度是否超过表长return -1for i in range(len(Elem)):              # 开始载入self.data[self.size] = Elem[i]self.size += 1# 在指定位置添加数据def add(self,pos,e):                        # pos为指定位置,e为数据的值if self.size == self.MaxSize:return -1i = self.sizewhile i > pos:self.data[i] = self.data[i - 1]i -= 1self.data[pos] = eself.size += 1# 删除指定位置的数据                           # pos为指定位置def delete(self,pos):if self.size == 0:return -1for i in range(pos,self.size - 1):self.data[i] = self.data[i + 1]self.data[self.size - 1] = Noneself.size -= 1# 判断顺序表的空间是否还有剩余def judge(self):if self.size == self.MaxSize:print('The list is full!')		# 这个表已满elif self.size == 0:print('The list is empty!')		# 这个表是空的else:vac = self.MaxSize - self.sizeprint('There are only %d vacancies left!' % vac) # 这个表还剩下vac个位置# 查找def search(self,e):for i in range(len(self.data)):if self.data[i] == e:print("The position of the data you are searching is:%d" % i) # 你要查找的数据的位置是ibreak# 添加空间def allocate(self,new_size):self.data += [None] * new_sizeself.MaxSize += new_sizea = [1,2,3,4,5]
sqlist = SqList(6)
print('The list you have created:')                 # 你创建的表
print(sqlist.data)
sqlist.load(a)              # 载入数据
print('The list after you put datas in:')           # 输入数据后的表
print(sqlist.data)
sqlist.add(5,6)             # 添加数据
print('Add the data 6 on position 5:')              # 在5号位置上添加数据6
print(sqlist.data)
sqlist.delete(0)            # 删除数据
print('Delete the data on position 0:')             # 删除0号位置的数据
print(sqlist.data)
print('Search the position of data 6------------------------')  # 查找数据值为6在表种的位置
sqlist.search(6)            # 查找数据在表中的位置
print('Judge the rest places of the list-------------------------') # 判断表种剩余的空间
sqlist.judge()              # 判断表中剩余空间的情况
sqlist.allocate(3)          # 增加表空间
print('The rest places of the list after allocating new places---------------------')  # 重新分配空间后表种剩余的空间
sqlist.judge()              # 判断表中剩余空间的情况

执行结果为
在这里插入图片描述

代码分析

  1. 判断操作是否可行

在每次对表进行操作时都要思考一下这个操作是否一定能执行,若不是百分之百能执行,就需要进行相应的判断,对不能执行的情况作出解释。

例如,添加元素时,如果表满了,那么添加元素这个操作就不能执行,此时就可以写一行代码提醒一下表已满,也可以继续说明是否需要增加空间,若需要就调用增加空间的函数…

  1. 分配表空间的问题

这个要用到python中序列相加的概念,同一数据类型的序列可以相加然后合并。

例如列表和列表相加,合成一个大列表;元组和元组相加,合成一个大元组等等

  1. 当然对顺序表的操作还可以有很多种,读者们可自行定义

顺序表的优缺点

优:

  1. 操作简单
  2. 适用于数据量小的表
  3. 对于尾端插入和查找数据在表中的位置时间复杂度低

缺:

  1. 不适用于数据量大的表
  2. 表结构固定,不灵活,不易于调整和变化
  3. 因为增加、删除数据时需要移动表中的其它数据,所以对于增加、删除数据的时间复杂度较高

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytorch 神经网络特征可视化

可参考博客 Pytorch可视化模型任意中间层的类激活热力图(Grad-CAM)_潜行隐耀的博客-CSDN博客_pytorch热力图 Pytorch输出网络中间层特征可视化_Joker-Tong的博客-CSDN博客_输出网络中间特征图 GitHub - utkuozbulak/pytorch-cnn-visualizations: Pytorch implementation of …

浅谈IT系统性能优化

一个刚上线的IT系统,往往负载压力不大,所以不会存在什么性能问题。这时,人们大多只关心系统的功能性和用户体验。但是,随着时间推移,用户量和数据量都比刚上线的时候要多很多,高并发和大数据场景下,系统遇到性能瓶颈,持续不能改善最终导致系统崩溃。这对于做C端的开发人…

<Python的变量创建与使用>——《Python》

目录 1.常量和表达式 2.变量和类型 3.变量的语法 后记:●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教! …

python语言思想

python语言基础与应用 超级计算器 python语言解释器 为啥选用PYCHARM create new project: NANE 选择解释器 open ,选择打开文件或者加入project 注意对齐与缩进 注意字母大小写、空格 注意左右括号配对 错误是常见的,跟BUG和缺陷斗争得到过程 观察代…

08 字符串连接符 “+“ 导致的 check cast 的省略

前言 // 年轻时候,到了冬天,家人让你穿秋裤,你不仅不穿秋裤,还露着脚脖子,如果有人劝你,你会嫌他唠叨。而等你岁数大一点,天气一冷,身体受不了,就自觉把秋裤穿上了。 呵…

图论二分图问题讲解-染色法和匈牙利算法

二分图 概述: 二分图又称作二部图,是图论中的一种特殊模型。 设G(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的…

使用Python将微信和支付宝账单导入随手记

简介 本文介绍如何使用Python将微信和支付宝账单转换为可以导入随手记的文件,实现微信和支付宝账单的批量导入。 需求: 1、需要将支付宝和微信上的支出账单自动或半自动地导入到随手记中 已知信息: 1、支付宝和微信的app端都可以导出csv…

引导过程与服务控制

目录: 1、引导过程总览 2、备份与恢复第一块硬盘前512字节 3、修复GRUB引导故障 4、忘记密码 5、开关系统服务控制Linux操作系统引导过程引导过程总览: 开机自检→MBR引导→GRUB菜单→加载内核→init进程初始化 1、bios 检查硬件设置grub功能和组成 bootloader:引导加载器,…

npm install ,npm ERR code 401 Incorrect or missing password 错误原因与.npmrc 配置文件的使用

前言:前端去维护项目时,通过 git clone 下来以后,经常是直接 npm install 去安装项目需要的 node_modules ,但是往往很多项目不是我们自己写的,或者从 GitHub 上面 clone 的开源项目,这个时候出现问题就很难…

【ASM】字节码操作 转换已有的类 ClassReader 删除方法 添加方法

文章目录 1.概述2.案例2.1 删除方法2.2 添加方法2.3小总结3.总结1.概述 上一篇文章:【ASM】字节码操作 转换已有的类 ClassReader 修改字段信息 删除字段 增加字段 在上一篇文章中我们学到了如何添加字段与删除字段。 本章节我们来尝试修改方法和删除方法。 2.案例 2.1 删…

搜索查找类

查找搜索类\color{blue}{\huge{查找搜索类}}查找搜索类 find find指令从指定目录向下递归地便利各个子目录,如果在/root目录下进行寻找,根据文件目录的树状结构,就是进行全盘查找,非常浪费时间,所以使用find 进行寻找…

MATLAB | 绘图复刻(二) | 折线图+误差棒+柱状图+散点抖动+灰色背景+图片叠加

看到gzh R语言ggplot2科研绘图发布了一篇绘图复刻类文章,复刻了: Nature(IF49.962)文章(Gut microbiota modulates weight gain in mice after discontinued smoke exposure)其中的Figure.1b,绘制效果十分惊艳,手痒就想拿MATLAB也…

RocketMQ 消费者Rebalance算法 解析——图解、源码级解析

🍊 Java学习:Java从入门到精通总结 🍊 深入浅出RocketMQ设计思想:深入浅出RocketMQ设计思想 🍊 绝对不一样的职场干货:大厂最佳实践经验指南 📆 最近更新:2022年10月15日 &#…

(附源码)计算机毕业设计大学生网上书店

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

(附源码)计算机毕业设计电脑外设销售系统小程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

操作系统基本功能(操作系统)

目录 一、处理机管理 二、存储器管理 三、设备管理 四、文件管理 五、作业管理 一、处理机管理 中央处理机(CPU)是计算机系统中一个举足轻重的资源。用户程序进入内存后,只有获得CPU,才能真正得以运行。 为了提高CPU的利用率…

前端都应该了解的 NodeJs 知识及原理浅析

node.js 初探 Node.js 是一个 JS 的服务端运行环境,简单的来说,它是在 JS 语言规范的基础上,封装了一些服务端的运行时对象,让我们能够简单实现非常多的业务功能。 如果我们只使用 JS 的话,实际上只是能进行一些简单…

docker mysql8使用SSL及使用openssl生成自定义证书

《docker安装MySQL8》 修改my.cnf vi /docker_data/mysql/conf/my.cnf[client] default-character-setutf8mb4 [mysql] default-character-setutf8mb4 [mysqld] character-set-serverutf8mb4 default_authentication_pluginmysql_native_password #增加ssl ssl保存&#xff0…

【让你从0到1学会c语言】文件操作

作者:喜欢猫咪的的程序员 专栏:《C语言》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》 目录 什么是文件: 我们为什么要使用文件呢? 文件分类&#x…

rbf神经网络和bp神经网络,rbf神经网络百度百科

1、rbf神经网络算法是什么? RBF神经网络算法是由三层结构组成,输入层至隐层为非线性的空间变换,一般选用径向基函数的高斯函数进行运算;从隐层至输出层为线性空间变换,即矩阵与矩阵之间的变换。 RBF神经网络进行数据运算时需要…