顺序表
int=1,2,3,4,5
内存是以一个字节作为基本单元,一个字节有八位,内存是一个连续的存储空间。
cpu通过查询内存地址来提取内存中存储的内容。
一个字节的八位整体会有一个地址。
整型会占四个字节。一个整型会有32位,占四个字节。
取整型和取字符的方法不同。
顺序表的基本布局
一个整型在内存中的布局
如何连续的储存三个整型
顺序表基本布局
- e是存储的数据
- L0 基本地址
- c每个元素占的字节数。
- li将指针定位到第一个元素所在的地址位置,通过偏移量索引到需要提取的元素。
元素外置,用内存区存储地址,因为每个地址都对应四个字节,但整型和字符串类型的数据对应的字节数不同。
顺序表代表的是存储目标元素的地址,通过偏移量索引到地址提取出地址对应的元素类型和大小。
顺序表的结构与实现
顺序表的结构:
-
数据区:元素集合
-
表头信息:为实现正确操作而需记录的信息:主要包括存储区的容量和当前表中已有的元素个数亮相。
顺序表的两种基本实现方式
-
一体式结构:将表头和数据区以连续的方式存储在一块存储区里
-
分离式结构:表对象里只保存与整个表有关的信息,实际元素存放在另一个独立的元素储存区里,通过连接与基本表相关联。==在链接中存储元素储存区的地址。
优劣分析:采用分离式需要额外进行一次间接访问。但是当元素个数超出储存区容量时,需要创建一个新的元素储存区,一体式结构需要表头信息同样复制到新的元素储存区中,而分离式结构只需更改链接处的地址。在分离式结构中,表头的起始地址是不改变的。一般选用分离式结构顺序表。
顺序表数据区的替换与扩充
扩充的两种策略:
-
每次扩充增加固定数目的存储位置。线性增长。特点:节省空间,操作频繁,操作次数多
-
每次扩充容量加倍。特点:减少了扩充操作的执行次数,但可能会浪费空间资源。以空间换时间,推荐的方式
顺序表删除元素
-
删除尾部元素 O(1)
-
非保序的元素插入 O(1)
-
保序的元素插入 O(N)
元素的删除与增加从尾部删除或添加比从头部或中间删除或添加要简单许多。时间复杂度低。
Python中的顺序表
Python和中的list和tuple就是采用了顺序表的实现技术。
list的基本实现技术
主要特征:
-
基于下标位置的高效元素访问和更新,复杂度为O(1)
-
允许任意加入元素,且在不断加入元素过程中,表对象的标识(id)不变。为满足该特征,就必须能更换元素存储区,并且为保证更换存储区时list对象的标识id不变,只能采用分离式实现技术
list就是一种采用分离式技术实现的动态顺序表。这就是为什么append比在指定位置插入元素效率高的原因。
支持扩充的顺序表称为动态顺序表。
在python的官方实现中,list采用了如下的策略:在建立空表时,系统分配一块能容纳八个元素的存储区;在执行插入操作时,如果元素存储区满就换一块四倍大的存储区。但如果此时的表已经很大,则改变策略,采用加一倍的方法。引入这种改变策略的方式,是为了避免出现过多空闲的存储位置。