数据结构笔记--数组

什么是数组:数组底层是线性表数据结构,是一组连续的内存空间并存储的是同一类型的数据。

数组的特点:

  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相比于数组,封装了很多细节, 比如:插入和删除的数据搬移和提供了自动扩容的功能, 但要警惕自动扩容功能,数据过多是可能会有性能问题

 

posted @ 2021-10-22 17:16  一个coder  阅读(155)  评论(0编辑  收藏  举报