什么是数组?
数组是一种线性表数据结构,用一组连续的内存空间,存储一组具有相同类型的数据。
线性表:数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。
当计算机需要随机访问数组中的某个元素时,它会首先通过下面的寻址公式,计算出该元素存储的内存地址:
a[i]_address = base_address + i * data_type_size
其中 data_type_size 表示数组中每个元素的大小
试着用swift根据动态数组的思路实现一下,对自己的收货也非常大。
动态数组的接口设计
![](https://img.haomeiwen.com/i1840661/835d1131832834d9.png)
动态数组的实现
![](https://img.haomeiwen.com/i1840661/a6f650477e15a356.png)
add添加元素
![](https://img.haomeiwen.com/i1840661/eba95b9cb0f85fb0.png)
往数组中第k个位置添加元素,后面第k~n个元素都需要顺序往后移动,才能保持内存连续性
最好情况:在数组末尾添加,不需要移动任何元素,时间复杂度为O(1)
最坏情况:在数组头部添加,从头开始所有元素往后移动一位,时间复杂度为O(n)
remove删除元素
![](https://img.haomeiwen.com/i1840661/5077a7fba7a8e062.png)
删除数组中第k个位置元素,后面第k~n个元素都需要顺序往前移动,才能保持内存连续性
最好情况:删除数组末尾元素,不需要移动任何元素,时间复杂度为O(1)
最坏情况:删除数组头部元素,后面所有元素往前移动一位,时间复杂度为O(n)
动态扩容
说白了,就是当前这块存储空间满了,需要重新分配一块连续的内存,然后把所有的元素拷贝过去。
![](https://img.haomeiwen.com/i1840661/31051a4c5a7cc0b8.png)
数组优化-环形缓冲
我们来对数组做一个优化
添加一个first指针,一直指向数组的首元素
![](https://img.haomeiwen.com/i1840661/34fd66c1b7a6d823.png)
![](https://img.haomeiwen.com/i1840661/65bdb67b2b19c0ea.png)
![](https://img.haomeiwen.com/i1840661/640a9b6e42092e87.png)
![](https://img.haomeiwen.com/i1840661/07cbbc7ea622d96e.png)
以插入为例,分为头部插入,尾部插入和中间插入,最主要的是realIndex的计算
尾部插入:直接插入最后面就行,时间复杂度为O(1)
头部插入:插入到原来first往前的一个位置,时间复杂度为O(1),此时first指向新插入的位置
中间插入:与中间位置进行对比,只移动一半的元素即可,时间复杂度会降低一半
网友评论