动态数组
无限
个相同类型
的元素组成的集合叫动态数据。相较于数组动态数组的容量是动态的,不用在创建时声明需要开辟多大的内存空间
实现原理
- 动态数组通过扩容和缩容来实现自动分配数组容量的操作。
- 扩容: 当开辟的数组容量满并且还要插入元素的时候,就开辟一个容量为原来
数组
两倍(这里两倍是大多数语言都采用的数值,并不一定必须两倍)的新数组并将旧数组
的数据移动至新数组
。
这种操作被称之为数组的扩容
- 缩容:当取出元素之后数组中的元素占据
不足当前容量
的一半时, 会开辟一个为当前数组容量一半的新数组
并将原数组元素移动至新数组中。此过程称之为数组的缩容
复杂度分析
- 假设 n为当前动态数组内存储的元素个数
- 严格来说,当触发
扩容
、缩容
操作的时候复杂度为 O(n), 未触发时为 O(1)。
但在正常使用过程中扩容
、缩容
操作出现的概率很小,所以这里引入均摊复杂度
的概念。
也就是说我们近似的认为动态数组的时间复杂度是O(1)
注意事项
- 复杂度震荡
可能会有如下情况: 当一个动态数组在插入第5个元素时会触发扩容
。
然后插入第5个元素触发扩容
、取出第5个元素又触发缩容
。
如此反复那动态数组的时间复杂度就会退化为O(n),这种情况就叫复杂度震荡
。
那么如何解决复杂度震荡的问题?很简单,只要不那么频繁的触发缩容就好了。
做法就是当元素数量不足原来1/4的时候再触发缩容到原来容量一半的操作,这样就破坏了反复扩容
、缩容
的条件。
实现
- Python
- java
算法应用
- 简单 两数和