数组和链表结构
数组数据结构
数组(arry)表示的是可以在给定的索引位置访问或替代的项的一个序列。你可能认为,这个表述和python列表的表述有点像。实际上Python列表的底层数据结构就是数组,尽管Python程序员通常会在你想要使用数组的地方使用列表,但是在Python和很多其他的编程语言中,集合中的实现结构主要是数组,而不是列表。
数组操作对应的方法
数组操作 | 内部实现方法 |
---|---|
a = Array(10) | __init__(capacity) |
len(a) | __len__() |
str(a) | __str__() |
for item in a : | __iter__() |
a[index] | __\getitem__(index) |
a[index]= newItem | __getitem__(index,newItem) |
随机访问和连续内存
数组索引是一个随机的访问操作,计算机通过执行一定数目的步骤,获取了第i项的位置。
因此不管数组有多大,它访问的第一项所需的时间与访问最后1项所需的时间都是相同的。
数组的某一项的地址可以通过将两个值相加来得出,即通过数组的基本地址和项的偏移地址相加。
数组的基本地址是数组的第 1项的机器地址,一个项的偏移地址等于它的索引乘以数组的一项所需的内存单元数目的一个常量表示(Python中这个值总是1)
Python数组中的索引操作有两个步骤:
1.获取数组内存块的基本地址
2.给这个地址加上索引,返回最终的结果
Pascal语言中,数组是静态的数据结构,数组的长度和大小都是在编译时确定的。需要在编译前用一个常量来指定这个大小,由于程序不能够在运行时修改数组长度,就需要预先判断应用运行时需要用到多少内存。此时可能出现浪费内存或数组长度超出设定的状况。
Java和C++中,允许程序创建动态数组来弥补这一问题,如静态数组一样,动态数组占据了连续的内存块并且支持随机访问。在运行时并不需要知道动态数组的长度,因此可以在实例化的时候指定一个动态数组的长度
调整数组长度的方法:
1.在程序开始的时候 创建一个具有合理默认大小的数组。
2.当数组不能保存更多的数据时,创建一个新的更大的数组,并且从旧的数组中转移数据项。
3.当数组似乎存在浪费的内存的时候,以一种类似的方式来减小数组的长度。
Python中调整大小是自动的
物理大小和逻辑大小
数组的物理大小是它的数组单元的总数,或者说是创建数组的时候用来指定其容量的数字。
数组的逻辑大小是它当前可供应用程序使用的项的数目
数组的操作
增加物理大小
通过以下三个步骤增加物理大小:
1.创建一个新的,更大的数组。
2.将数据从旧的数组复制到新的数组中。
3.将旧的数组变量重新设置为新的数组对象。
即:
if logicalSize == len(a):
temp = array(len(a)+1)
for i in range(logicalSize):
temp[i] = logicalSiz[i]
a = temp
减小物理大小
相应的,通过以下三个步骤减小物理大小:
1.创建一个新的,更小的数组。
2.将旧的数组的数据复制到新的数组中。
3.将旧的数组变量重新设置为新的数组对象。
在数组中插入一项
执行插入时,需执行以下四步:
1.如有必要,要检查可用的空间。
2.从数组的逻辑末尾,直到目标索引位置,将每一项都向后移动一位。
3.将新的项复制给目标索引位置。
4.将逻辑大小增加1
在数组中删除一项
执行插入时,需执行以下四步:
1.从紧跟目标索引位置之后位置开始,到数组的逻辑末尾,将每一项都向前移动一项。
2.将逻辑大小减小1
3.若有必要,将数组的物理大小减小1