数据结构第二天,完成啦!QAQ,开心!
目录
<2>分离式:表头内容和地址不需要变化,只需要改变存储地址的指向即可
1、顺序表
内存是以一个字节为索引单位的,一个字节是八位的,一个字节有一个地址;一个整型存放的时候需要4个字节;字符串中的一个字符要占一个字节
存储整数型数值1时,要转换为二进制形式存放,如下图所示
如果有一个列表li = [7, 21, 39],存储情况如下(当存储的数据类型相同时,采用的是顺序表的基本布局形式):
(1)顺序表的基本布局
在列表中进行查找的话,锁定第一个元素的初试位置,在偏移量处直接找到访问的元素
(2)元素外置的顺序表
列表里用来存储不同数据类型的数据,每个数据所占用的字节不同,所以存储的是数据对象的地址,一个地址是一个整型数据,所以占用4个字节。
2、顺序表的结构和实现
(1)顺序表的结构
一般来说顺序表有表头信息和数据区两个内容,表头里面包括容量和现有元素个数。因为一开始要存储多少个数据是未知的,但是如果容量比实际存储的元素少,那么最后添加的内容跟之前的内容就不一定连续了。一开始要对存储容量进行一个预估
(2)顺序表的两种基本实现方式
当增加到5个元素时,由于之前申请的空间不够,所以只好重新申请一个空间来使用
<1>一体式:为了保证顺序结构,表头也需要申请新的地址
<2>分离式:表头内容和地址不需要变化,只需要改变存储地址的指向即可
3、元素存储替换和元素存储扩充
在列表元素增加到超出列表容量的时候,我们直接对存储地址进行了替换。
存储地址替换的同时,也要对列表容量进行扩充,进行扩充有两种策略:
1、每次扩充增加固定数目的存储位置,如每次扩充增加10个元素位置;相对节省空间,但是扩充操作频繁,操作次数多
2、每次扩充容量加倍,用空间换时间,减少了扩充操作的执行次数,但可能会比较浪费空间资源
4、增加元素
对于三种情况来说,a)方法的时间复杂度为O(1);b)方法的时间复杂度为O(1);c)方法的时间复杂度为O(n)
5、删除元素
A)方法的时间复杂度为O(1);
B)方法的时间复杂度为O(1);
C)方法的时间复杂度为O(n)
6、Python中的顺序表
Python中的list和tuple两种类型采用了顺序表的实现技术,具有前面讨论的顺序表的所有性质,tuple是不可变类型,是不变的顺序表,其他方面跟list性质类似
List基本实现技术
1、基于下标位置的高效元素访问和更新,时间复杂度为O(1)
2、允许任意加入元素,而且在不断加入元素的过程中,表对象的标识不变——用分离式结构进行存储的。
3、由于列表中存储的数据类型可以不一致,所以其采用的存储方式是元素外置型,直接储存元素的地址
4、数据存储区是动态变化的,当存储区满时,可以申请新的存储区进行扩充,这种顺序表称为动态顺序表。List是动态顺序表,python中的list在建立空表时,系统会给8个元素——4个字节,一个整型的存储区(因为不管存储的数据有多大,是什么类型,在存储的时候,都是存储地址,地址一般是整型数据,也就是4个字节);在进行存储区扩充的时候, 元素区满就换一个4倍大的存储区,当达到50000(阀值)的时候,就扩大一倍,这是为了避免出现过多空闲的存储位置。