数据结构-数组和稀疏数组


数组

数组是一种数据结构,其可以在内存中连续存储多个数据元素,在内存中的分配也是连续的。

如上图,是一个长度为6的int型数组。数组在创建的时候会在内存中开辟一段连续的内存,数组中的元素都是同一类型的(也就意味着数组中每一元素所占用的内存是一样的),数组长度确定后不能再修改,数组是引用类型,可存在多态行为:

点击查看代码
class Person{}
class Student extends Person{
    public static void main(String[] args){
        Person[] p = new Stunent[6];
    }
}

使用数组来存储数据的优点:数组成功创建后,每一个数据都有索引,可以通过其索引来对数据进行查询,按照索引来遍历数据也方便。

缺点:

  1. 数组的大小固定后就无法扩容了(如果要扩容得新建另一个数组)。
  2. 数组只能存储一种类型的数据。
  3. 添加、删除的操作慢,因为每次添加或删除都要移动其他的元素。

因此,适用场景:频繁查询,对存储空间要求不大,很少增加和删除的情况。

稀疏数组

稀疏数组处理方法:把一个数组中不同值的信息(行、列和对应值)以及数组的信息(行数、列数、有多少个不同的值)都记录进另一个小规模的数组(稀疏数组)。如下:

使用的场景:当一个数组中大部分元素是同一个值时,此时可通过稀疏数组来降低需要存储的数据。

稀疏数组的实现模拟:

点击查看代码
/* 原始数组............................ */
int[][] originalArray = new int[4][4];
originalArray[0][0] = 1;
originalArray[1][1] = 2;
originalArray[2][2] = 3;
/* 稀疏数组............................ */
/* 将原始数组存为稀疏数组 */
/* 1.遍历得到原始数组中不同的值的个数*/
int sum = 0;
for (int i = 0; i < originalArray.length; i++) {
    for (int j = 0; j < originalArray.length; j++) {
        if (originalArray[i][j] != 0) {
            sum++;
        }
    }
}
/* 2.创建稀疏数组
* 思路:要存储原始数组的行数、列数、不同值 ===> 列数为3,存储不同值 ===> 根据不同的值的个数创建列数
* */
int[][] sparseArray = new int[sum + 1][3];
sparseArray[0] = new int[]{4,4,sum};
/* 3.将原始数组中不同的值放入稀疏数组
* 思路:1、明确要存放的东西:不同值的信息(坐标和值)
*      2、存放在稀疏数组中哪个位置:以遍历到的不同值的次序依次存放
* */
int count = 0; // 记录是第几个非0数
for (int i = 0; i < originalArray.length; i++) {
    for (int j = 0; j < originalArray.length; j++) {
        if (originalArray[i][j] != 0) {
            count++;
            sparseArray[count][0] = i;
            sparseArray[count][1] = j;
            sparseArray[count][2] = originalArray[i][j];
        }
    }
}