Python中的顺序表介绍

在 Python 中,列表是一种基本的数据类型,列表的数据组成了一个序列,序列里的数据是有序的(索引),可以快速地找到指定的数据。

在开发中,经常需要将一组数据作为一个整体来处理。如果一组数据组成了一个序列,且数据在序列里有位置和顺序关系,则构成的序列被称为线性表,如 Python 中的列表。

一、线性表简介

一个线性表是某类数据元素的一个集合,表里同时记录着元素之间的顺序关系。

线性表是最基本的数据结构之一,在实际程序中应用非常广泛。

线性表的数据之间有顺序关系,顺序关系分为两种,一种是物理有序,即数据物理存储的位置顺序与数据之间的顺序关系一致,另一种是逻辑有序,即数据之间的顺序关系是由某种逻辑关系来决定的,与物理存储的位置无关。

对于不同顺序关系,线性表数据的存储方式也不相同,物理有序的数据要保证物理顺序,需要连续存储在一起,而逻辑有序则不必,数据可以分散存储。

根据线性表的顺序关系,可以将线性表分成两种:

顺序表:将元素按顺序存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序决定。

链表:将元素存放在通过链接构造起来的一系列存储块中,元素间的顺序关系由它们之间的链接顺序来决定。

本文先介绍顺序表,链表后面再研究。

二、顺序表简介

顺序表的信息分为两个部分,“表头”部分和数据集合部分。

“表头”是顺序表的整体信息,包含了元素存储区的容量和当前表中已有的元素个数。

数据集合部分是顺序表中的所有数据连续存储的集合部分。

“表头”部分和数据集合部分可以存储在一起,也可以分开存储,所以顺序表分为两种结构。

一体式结构:存储“表头”的单元与数据集合以连续的方式存储在一块存储区里,整体形成一个顺序表对象。一体式结构整体性强,易于管理,但由于数据存储区域是表对象的一部分,顺序表创建后,元素存储区就固定了。

分离式结构:表对象里只保存与表有关的信息(即“表头”),实际数据元素存放在另一个独立的元素存储区里,“表头”通过引用与元素集合关联。

在顺序表中,数据是连续存储的,为了快速地找到顺序表中的数据,每个元素所占的存储单元大小相同。

元素都有下标,下标决定元素的逻辑地址,元素存储的物理地址(实际内存地址)可以通过存储区的起始地址Loc(e0)加上逻辑地址(第i个元素)与存储单元大小(c)的乘积计算而得,Loc(ei) = Loc(e0) + c*i 。

通常,顺序表中存储的是同一种类型的数据,但也有很多存放不同类型数据的顺序表,如一个列表中既有数字也有字符串等。为了保证顺序表的每个元素占用相同的存储单元,顺序表有两种元素存储方式。

直接存储数据:如果元素数据类型相同,占用的存储单元统一,则顺序表中直接存储数据本身。

元素外置存储:如果元素的数据类型不统一,则须采用元素外置的形式,将实际数据另行存储,顺序表中保存对应元素的引用。由于每个引用所需的存储单元相同,依然可以计算出元素引用的存储位置,然后顺着引用找到实际存储的数据。

三、顺序表的相关操作

1. 更换数据存储区

一体式结构的信息区与数据存储区连续在一起,若想更换数据存储区(数据扩充时),只能整体搬迁,信息区也要一起更换(顺序表id发生了改变)。

分离式结构要更换数据存储区,只需将信息区中的引用更新即可,信息区不用改变(顺序表id不发生改变)。

2. 扩充顺序表元素存储区

分离式结构的顺序表,如果需要将数据区更换为存储空间更大的区域,可以在不改变表对象(顺序表id)的前提下对其数据存储区进行扩充。

只要程序的运行环境还有空闲存储,分离式结构的顺序表就不会因为满了而导致操作无法进行。

分离式结构的顺序表被称为动态顺序表,因为其容量可以在使用中动态变化。

扩充顺序表有两种常见的策略,分别是按固定数量扩充和按当前容量加倍。

按固定数量扩充:每次扩充增加固定数目的存储位置,如每次扩充增加10个元素位置,这种策略称为线性增长扩容。比较节省空间,但是扩充操作频繁,操作次数多。

按当前容量加倍:每次扩充容量加倍,每次扩充会增加一倍的存储空间。减少了扩充操作的执行次数,但可能会浪费空间资源。

四、Python中的顺序表

Python 中的列表 list 和元组 tuple 两种数据类型都属于顺序表。

Python 中的列表有以下特点:

1. 元素保存在一块连续的存储区中,元素有下标,所以可以使用下标来高效地访问和修改元素。

2. 分离式结构,“表头”与数据存储区是分开存储的,数据存储区发生了改变,表对象(id值)不会改变。

3. 元素外置存储,元素可以是任意类型的数据,列表中保存的是元素的引用。

4. 可以任意加入元素,在不断加入元素的过程中如果需要扩容,列表会动态扩容。

5. 元素保序,在列表中加入和删除元素,操作之后列表中的元素会维持已有的顺序不变。

元组 tuple 是 Python 中的不可变数据类型,是不变的顺序表,因此不支持改变内部状态的操作,而其他方面,与列表 list 的性质类似。

列表和元组是 Python 语言为开发者设计好的顺序表数据类型,非常方便好用。除了使用现成的顺序表,我们也可以自己实现顺序表。

Python中的顺序表介绍相关推荐

  1. Python中的顺序表

    Python中的顺序表 Python中的list和tuple两种类型采用了顺序表的实现技术,具有顺序表的所有性质. tuple是不可变类型,即不变的顺序表,因此不支持改变其内部状态的任何操作,而其他方 ...

  2. python列表是顺序表还是链表_顺序表与链表

    Python中的顺序表 Python中的list和tuple两种类型采用了顺序表的实现技术,具有前面讨论的顺序表的所有性质. tuple是不可变类型,即不变的顺序表,因此不支持改变其内部状态的任何操作 ...

  3. python列表中随机两个_随机化两个列表并在python中维护顺序

    随机化两个列表并在python中维护顺序 说我有两个简单的清单, a = ['Spears', "Adele", "NDubz", "Nicole&q ...

  4. 【Python 实战基础】Python 中 PyQt6 的 QPen 介绍

    目录 一.实战场景 二.主要知识点 文件读写 基础语法 PyQt6 QPen 三.菜鸟实战 一.实战场景 实战场景:Python 中 PyQt6 的 QPen 介绍 二.主要知识点 文件读写 基础语法 ...

  5. Python中测试代码的介绍

    文章目录 前言 一.测试的目的 二.测试函数 1.断言方法 2.可通过的测试 3.不可通过的测试 4.添加多个测试 三.测试类 1.简单的测试类 2.含多个答案的测试类 3.setUp()方法 总结 ...

  6. Python中numpy.power()函数介绍

    Python中numpy.power()函数介绍 power(x, y) 函数,计算 x 的 y 次方. 示例: x 和 y 为单个数字: import numpy as npprint(np.pow ...

  7. python顺序表的实现_python中的顺序表

    Python中的list和tuple两种类型采用了顺序表的实现技术,tuple是不可变类型,即不变的顺序表,因此不支持改变其内部状态的任何操作,而其他方面,则与list的性质类似. list的基本实现 ...

  8. python列表是顺序表还是链表_Python 中的 List 是封装了顺序存储结构还是链表存储结构?...

    19 2018-08-30 11:12:20 +08:00 1 @Alerta 这里是 list.insert 的实现,我把关键的实现挑出来: ins1(PyListObject *self, Py_ ...

  9. python中运算符优先级_介绍python中运算符优先级

    原标题:介绍python中运算符优先级 下面这个表给出Python的运算符优先级,从最低的优先级(最松散地结合)到最高的优先级(最紧密地结合).这意味着在一个表达式中,Python会首先计算表中较下面 ...

最新文章

  1. 让容器应用管理更快更安全,Dragonfly 发布 Nydus 容器镜像加速服务
  2. 利用代码生成right scope数据
  3. linux 查看vnc端口_VNC常用操作及常见问题解决办法汇总
  4. 信息系统项目管理师论文优秀范文_软考 信息系统项目管理师备考指南
  5. 微软(中国)CTO韦青:人工智能时代还没有真正到来
  6. Hazelcast更换CEO,承诺继续造福开源社区
  7. 05《基于深度卷积神经网络的车型识别研究》学习总结
  8. java天猫精灵_教你玩转天猫精灵:把设备接入天猫精灵
  9. MathType快捷键
  10. 使用jquery处理多选框checkbox选中和未选中的值
  11. 前端面试题整理(一)
  12. Cisco SN查询工具
  13. 关于数据库的递归查询
  14. MIS和MES的区别
  15. ArrayList练习,随机数导入集合list内,方法实现偶奇数筛选
  16. 汇编语言: 试编制一个程序:从键盘输入一行字符,要求第一个键入的字符必须是空格符,如不 是,则退出程序;如是,则开始接收键入的字符并顺序存放在首地址为buffer的缓冲区中(空 格符不存入),直到接收
  17. 微信小程序图片处理方案,解决加载缓慢,影响用户体验
  18. SSH远程访问与TCP Wrappers 访问控制(基础概述及配置操作)
  19. 最新android系统下载,安卓6.0抢先体验方法|安卓6.0下载 安卓6.0系统下载地址_PC6教学...
  20. 告别传统模式 呼叫中心携手95013打造新生态圈

热门文章

  1. WPF MVVC 基础 - 父子窗体
  2. javascript--DOM概念
  3. 游戏中的“战争黑雾”和现实中的程序员处境
  4. Position independent code and data (ROPI and RWPI)
  5. Android中scrollview的scrollto方法不起作用的办法
  6. RabbitMq 3.0.1 技术预演资料
  7. .net知识和学习方法系列(二十)CLR-委托
  8. Web2.0十大Ajax安全漏洞以及成因
  9. 免费在线生成工具大全
  10. 分布式面试 - 为什么要进行系统拆分?