数据结构笔记--数组
什么是数组:数组底层是线性表数据结构,是一组连续的内存空间并存储的是同一类型的数据。
数组的特点:
1.线性表: 组装的数据像一条线一样的数据结构,数据只有前后两个方向
2.连续的内存和同一类型的数据:数组需要的是连续的内存空间,如果内存空间够但不是连续的,也是不行的。只能存储同一种类型的数据。 这两个限制生成了“随机访问”的特性。可以同个寻址公式,根据下标直接查找数据
一维寻址公式:a[i]_address = base_address + i * data_type_size。
二维寻址公式: 假设二维数组的维度为m * n a[i][j]_address = base_address + ( i * n + j) * data_type_size;
查找
1.查找:根据下标随机访问,查找的时间复杂度是 O(n)
2.插入:在插入前,需要搬运其它的数据(除了在数组最后插入)。 数组最后插入 O(N) , 中间插入平均复杂度O(N), 最差时间复杂度O(N) .
插入优化场景: 如果是在指定位置插入数据,可以先把指定位置的数据放到最后面,在把要插入的数据放在这个位置, 这样就避免了数据搬运
3.删除:删除也会导致数据搬运,删除最后一个时间复杂度是O(N), 平均和最差都是O(N).
删除优化场景,删除一个元素时先标记这个元素,不真正删除,当内存快要满了的时候,统一删除标记的数据。这样可以避免多次数据搬运 --> JVM的标记清除算法
问题
1.数组越界问题:java代码因为有内存管理所以不会有大问题, 但也要注意数组越界问题
2.ArrayList自动扩容问题: arraylist相比于数组,封装了很多细节, 比如:插入和删除的数据搬移和提供了自动扩容的功能, 但要警惕自动扩容功能,数据过多是可能会有性能问题