Python中的顺序表介绍

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 语言为开发者设计好的顺序表数据类型,非常方便好用。除了使用现成的顺序表,我们也可以自己实现顺序表。

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小斌哥ge

非常感谢,祝你一切顺利。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值