当前位置: 首页 > news >正文

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

🐳 前言

数据结构与算法的一刷是在前几个月的时候用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 = MaxSize
        self.size = 0                           # 当前表的数据量
        self.data = [None] * self.MaxSize       # 存储表中的数据

    # 加载数据
    def load(self,Elem):                        # 传入一个list,Elem是传入list的名
        if len(Elem) > self.MaxSize:            # 判断list的长度是否超过表长
            return -1
        for 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 -1
        i = self.size
        while i > pos:
            self.data[i] = self.data[i - 1]
            i -= 1
        self.data[pos] = e
        self.size += 1

    # 删除指定位置的数据                           # pos为指定位置
    def delete(self,pos):
        if self.size == 0:
            return -1
        for i in range(pos,self.size - 1):
            self.data[i] = self.data[i + 1]
        self.data[self.size - 1] = None
        self.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.size
            print('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) # 你要查找的数据的位置是i
                break
    # 添加空间
    def allocate(self,new_size):
        self.data += [None] * new_size
        self.MaxSize += new_size

a = [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. 因为增加、删除数据时需要移动表中的其它数据,所以对于增加、删除数据的时间复杂度较高

相关文章:

  • 分别使用BP/RBF/GRNN神经网络识别航迹异常matlab仿真
  • 8.RabbitMQ系列之RPC
  • 2022-10-15 Docker Harbor安装
  • 安装ROS-Academy-for-Beginners教学包时安装依赖的时候老是失败
  • OpenCV实战案例——车道线识别
  • 【Linux】进程控制 创建/终止/等待/替换
  • 【Linux】远程登陆、远程开发以及Vim的使用
  • Java项目本地部署宝塔搭建实战校园二手市场系统源码
  • EMC诊断技术及电磁兼容理论设计
  • 洛谷——【入门1】顺序结构题解
  • 计算机视觉 立体视觉极简一览
  • envoy开发调试环境搭建
  • 多线程轮流打印 ABC
  • SpringCloud整合spring security+ oauth2+Redis实现认证授权
  • 轻量级开源ROS 的机器人设备(一)
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • ECMAScript入门(七)--Module语法
  • ES学习笔记(12)--Symbol
  • JS函数式编程 数组部分风格 ES6版
  • Mac转Windows的拯救指南
  • Terraform入门 - 3. 变更基础设施
  • Vue 2.3、2.4 知识点小结
  • 阿里云应用高可用服务公测发布
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 猴子数据域名防封接口降低小说被封的风险
  • 将回调地狱按在地上摩擦的Promise
  • 跨域
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 协程
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 在electron中实现跨域请求,无需更改服务器端设置
  • $ git push -u origin master 推送到远程库出错
  • (java)关于Thread的挂起和恢复
  • (二)Eureka服务搭建,服务注册,服务发现
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (强烈推荐)移动端音视频从零到上手(下)
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (一)基于IDEA的JAVA基础1
  • (转)Linux下编译安装log4cxx
  • ***检测工具之RKHunter AIDE
  • .net core控制台应用程序初识
  • .NET gRPC 和RESTful简单对比
  • .Net 代码性能 - (1)
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .net 微服务 服务保护 自动重试 Polly
  • .NET/C# 的字符串暂存池
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .net开发引用程序集提示没有强名称的解决办法
  • [].slice.call()将类数组转化为真正的数组
  • [Android] Amazon 的 android 音视频开发文档
  • [BUAA软工]第一次博客作业---阅读《构建之法》
  • [Bugku]密码???[writeup]