java数组之稀疏数组
稀疏数组的介绍
稀疏数组是一个经典的时间换空间的数组操作
稀疏数组为一个二维数组 列数固定为3列
当一个数组中大部分元素为0,或者同一数值的数组时,可以用稀疏数组来保存该数组
稀疏数组的处理方式是:
- 记录数组一共有几行几列,有多少个不同的值
- 把具有不同值的数字的位置即行 列 和 该数值记录在一个小规模的数组中,从而缩小程序的规模
稀疏数组的使用
以五子棋游戏为例
首先将这些数值用普通的二维数组表示并输出到控制台
int c[][]=new int[5][11];
c[0][2]=1;
c[1][3]=2;
for (int[] d:c) { //将数组遍历出来
for (int f:d) {
System.out.print(f+" ");
}
System.out.println();
}
输出结果为: //可以看到跟上面图片中的数值一样
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
用稀疏数组来保存上面的值
- 第一行:保存二维数组的总行数和总列数 和 有效数值的个数 可以看出上面二维数组的行数为 11 列数为11 有效数值个数为2个
- **第二行:**保存第一个有效数值的所在的行数 列数 以及数值 第一个有效数值为1 行数为0 列数为2 数组中的下标从0开始 行列同样
- 第三行:保存第一个有效数值的所在的行数 列数 以及数值 第一个有效数值为2 行数为1 列数为3
将数组存放到稀疏数组中 这就构成了一个稀疏数组
行 | 列 | 有效数值 |
---|---|---|
11 | 11 | 2 //有效数值个数 |
0 | 2 | 1 |
1 | 3 | 2 |
- 稀疏数组的第一行为二维数组的总行数和列数 以及有效数值的个数
- 下面依次保存的是 有效数值的行数 列数 以及数值
代码演示
将上面的二维数组用代码转换为稀疏数组
//按照上面的数据建立一个二维数组
int c[][]=new int[11][11];
c[0][2]=1;
c[1][3]=2;
//通过循环遍历求出该数组里的有效数值有几个
int num=0; //有效数值的个数
for (int i = 0; i <c.length ; i++) {
for (int j = 0; j <c[i].length ; j++) {
if (c[i][j]!=0){ //当有数字不为o时 就是有效数字 让 num+1
num++;
}
}
}
//建立一个二维数组作为稀疏数组
//该数组的总行数就是有效数值加一 ,每一行存放一个有效数字的行 列 和 数值 加上第一行存放的数值信息 所以加1
int x[][]=new int[num][3];
x[0][0]=11;
x[0][1]=11;
x[0][2]=num;
//通过循环遍历原始的二维数组得到有效数字的行 列 数值 并依此赋值给稀疏数组
int sum=1; //sum作为赋值下标 稀疏数组下标为 0 的第一行已经赋值过了 所以从1开始
for (int i = 0; i <c.length ; i++) {
for (int j = 0; j <c[i].length ; j++) {
if (c[i][j]!=0){
x[sum][0]=i; //行
x[sum][1]=j; //列
x[sum][2]=c[i][j]; //数值
sum++; //赋值过后让sum自增 作为下次赋值的下标
}
}
}
//将稀疏数组还原遍历
//新建一个二维数组 列和行 由稀疏数组第一行保存的值 赋值
int p[][]=new int[x[0][0]][x[0][1]];
//通过循环向新建的数组中赋值 赋值次数为 稀疏数组中保存的有效数字个数 也就是x[0][3]
for (int i = 1; i <x[0][3] ; i++) { //int = 1 跳过下标为0的第一列 第一列保存的是原始数组的 行数 列数 有效数值个数
p[x[i][0]][x[i][1]]=x[i][2];
//根据稀疏数组中保存的有效数值的 行 列 数值 向二维数组中赋值
}
//遍历二维数组 显示原始状态
for (int j[]:p) {
for (int o:j) {
System.out.print(o+" ");
}
System.out.println();
}
}
//稀疏数组是典型的时间换空间的方法
//数据的储存和调用比较复杂浪费时间 但是比起原始数据储存 忽略掉了大量的无用数值 节省了空间