2020/09/22
顺序表基本形式
其实就是按照顺序储存同一种数据的
我们存储一个纯数字列表的时候,存储了列表第一个元素在内存中的初始位置,当我们要按照下标去取数据的时候,因为数据在内存中是连续存储的,假设存储的第一个数据是0x01,那么第二个数据就是 0x0(1+4),第三个数据是 0x0(1+4*2),即按照数据的下标进行数据偏移即可;
如果储存的不是同一种数据时
就需要用元素外置,元素外置 其实就是把元素们存储在没有顺序的内存块里。把他们每个内存块的地址来进行顺序表方法。这样电脑也就根据每个顺序表来引入不同的元素
顺序表的结构
顺序表会有 表头信息 和 数据区两个部分组成。
表头信息 有两个元素, 现有元素个数和申请的内存的元素个数(容量)
数据区 就是 储存的数据有哪些。
一体式结构
就是把表头信息和数据区存储在一起,是按照顺序表来存储的。
优点就是可以直接访问
缺点就是 在扩充的时候,整体全部删移到新的顺序表 == 替换
分离式结构
表头会有3个数据,第三个数据指向元素存储区的第一个。
缺点就是 要间接访问,多一个数据
优点: 方便动态的修改。如果要添加数据存储区的数据,只需要把表头第3个数据修改就可以了。 数据区可以扩充的话 就叫做动态顺序表
扩充的两种策略
1.每次扩充增加固定数目的存储位置,如每次扩充增加10个元素位置,这种策略可称为线性增长。
特点:节省空间,但是扩充操作频繁,操作次数多。
2.每次扩充容量加倍,如每次扩充增加一倍存储空间。
特点:减少了扩充操作的执行次数,但可能会浪费空间资源。以空间换时间,推荐的方式。
增加元素
如图所示,为顺序表增加新元素111的三种方式
a. 尾端加入元素,时间复杂度为O(1)
b. 非保序的加入元素(不常见),时间复杂度为O(1)
c. 保序的元素加入,时间复杂度为O(n)
删除元素
a. 删除表尾元素,时间复杂度为O(1)
b. 非保序的元素删除(不常见),时间复杂度为O(1)
c. 保序的元素删除,时间复杂度为O(n)
python list和tuple的原理
Python中的list和tuple两种类型采用了顺序表的实现技术,具有前面讨论的顺序表的所有性质。
tuple是不可变类型,即不变的顺序表,因此不支持改变其内部状态的任何操作,而其他方面,则与list的性质类似。
list的基本实现技术
Python中list采用的是分离式顺序表和元素外置的存储结构;动态顺序表;开始分配8个元素的存储区,前期采用四倍扩充,超过5000采用一倍扩充 为了避免过多的空闲