一维数组:
一、概述:
- 数组在内存中是一片连续的空间且元素相同
- 可以快速根据索引定位到某元素
- 但是新增、删除元素的时候需要移动元素位置,效率会变低
二、数组的声明与创建:
1.有两种声明方式:
int[] a;
int a[];
2.创建方式有两种:
int[] a1 = new int[5]; //直接指定大小
int[] a2 ={1,2}; //有多少个value就有多大
三、自定义数组:
1.索引(数组索引)的语意:
索引可以有语意,也可以无语意,有语意如下标就是学号,能快速定位某学生;那么问题来了——如果索引无语意,如何判断有无数据,添加元素、删除元素呢?
2.自定义数组:
int[] data就是数组;capacity表示容量(等同于data.length;可以省略);size表示已经占用的大小。
由此可自定义数组的增删改查;
3.泛型数组:
4.动态数组(add时扩容):
动态扩容,即容量不够的时候再定义一个更加大(如像ArrayList那样1.5倍);然后将旧数组复制到新数组上,然后将原来的索引指向新数组,旧数组释放;
四、数组的时间复杂度:
1.新增:
2删除:
3修改:
4查询:
总结:
五、均摊时间复杂度:
有时均摊时间复杂度更合理:
六、解决复杂度震荡问题:
如果在扩容与缩容之间位置频繁操作,很浪费性能,我们可以lazy操作
(如,不直接缩容,等下一次操作也是删除的时候再缩容);或者当size为length的四分之一时再缩容即可,但是要判断lengtn不能小于初始容量:
二维数组:
七、二维数组的声明与初始化:
二维数组其实就是盛放数组的数组,二维数组的元素为一维数组
1.声明与初始化三种方式:
int[][] a1=new int[m][n];//m表示这个二维数组有多少数组,n表示一维数组的元素个数
int[][] a2=new int[m][];//一维数组的数量动态给出
int[][] a2={{a,b},{a,b},{a,b}};//隐式声明
2.二维数组的使用:
3.稀疏数组:
适用于数组中的数据总数远远大于非零数据的数量并且非零元素的分布没有规律 ;如刚开始下的五子棋:
数据结构与算法更多相关内容【持续更新中】: