一、数组的定义
数组Array是一种线性表
数据结构,它用一组连续
的内存空间,来存储一组具有相同类型
的数据
1.线性表
线性表是指数据排成像一条线一样的结构,每个线性表上的数据最多只有前后两个方向。常见的线性结构如:队列、栈、数组、链表等
非线性结构如:二叉树、堆、图
2.连续的内存空间和相同的数据类型
随机访问
:根据数组的下标随机访问数组中的元素
计算机给每个内存单元分配一个地址,通过地址访问内存中的数据。例如:计算机给数组a[10],分配一个连续的内存空间1000-1039,其中base_address=1000代表内存首地址
当计算机需要随机访问某元素时,通过寻址公式计算出元素存储的内存地址
a[i]_address = base_address + i * data_type_size
数组支持随机访问,根据下标随机访问的时间复杂度为O(1)<?font>
二、数组的插入和删除
1.插入操作
【数组有序】假设数组的长度为n,在数组的第k个位置插入一个新元素,需要将k-n这区间元素依次后移
- 如果是在数组的末尾插入,则最好的时间复杂度为O(1)
- 如果是在数组的开头插入,则最坏的时间复杂度为O(n)
- 平均复杂度为(1+2+…n)/n=O(n)。
【数组无序】如果将某个元素插入到第k个位置,为了避免数据搬移,直接将第k位置的数据搬至数组末尾,将新元素放到第k个位置
2.删除操作
如果要删除某个元素。为了内存的连续性,需要将数据搬移
- 删除末尾元素,最好的时间复杂度为O(1)
- 删除开头元素,最坏的时间复杂度为O(n)
- 平均时间复杂度O(n)
我们可以先记录下已经删除的数据。每次的删除操作并不是真正地搬移数据,只是记录数据已经被删除。当数组没有更多空间存储数据时,我们再触发执行一次真正的删除操作,这样就大大减少了删除操作导致的数据搬移。JVM标记清除垃圾回收算法