1、使用场景
当一个数组中大部分元素是0或者为同一个值的数组时,可以使用稀疏数组来保存该数组
比如点阵存在大量重复的数据,我们没必要耗那么大的空间来存储每一个元素,就可以使用稀疏数组来保存这样的点阵数据
2、围棋复盘演示稀疏数组代码
虽然这不是一个很好的例子,但是可以帮助我们理解稀疏数组,主要是因为围棋存在要到最后一子定输赢的时候,此时稀疏数组既要保存坐标信息,还要保存数据信息,反而扩大了程序的规模增大了内存的开销,此处只是为了便于理解,在存在大量重复数据的点阵,比如csv格式文件的传输上,就可以考虑使用稀疏数组来压缩空间传输。
描述:
创建一个20*20大小的围棋棋盘,0表示没子,1表示此处有白子,2表示此处有黑子
package algorithm;
import java.util.Arrays;
public class SparseArrayDemo {
public static void main(String[] args) {
//创建一个20*20大小的棋盘
int[][] checkerboard = new int[20][20];
checkerboard[5][6] = 1;
checkerboard[6][7] = 2;
//创建稀疏数组
//first:查找有效值的个数
int valid_value_num = 0;
for(int[] arr : checkerboard){
for (int i = 0; i < arr.length; i++) {
if(arr[i] != 0) valid_value_num+=1;
}
}
//second:创建稀疏数组,包含有效值个数+1个数组(第一行需要存储棋盘大小信息,边于复盘)
//大小为3,横坐标,纵坐标值,数据
int[][] sparseArray = new int[valid_value_num+1][3];
//棋盘长度
sparseArray[0][0] = checkerboard.length;
//棋盘宽度
sparseArray[0][1] = checkerboard[0].length;
//存储数据到稀疏数组
int index = 1;
for(int i = 0; i < checkerboard.length; i++){
for(int j = 0; j < checkerboard[0].length; j++){
if(checkerboard[i][j] != 0) {
sparseArray[index][0] = i;
sparseArray[index][1] = j;
sparseArray[index][2] = checkerboard[i][j] ;
index+=1;
}
}
}
//复盘
int[][] resume_array = new int[sparseArray[0][0]][sparseArray[0][1]];
for (int i = 1; i < sparseArray.length; i++) {
resume_array[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
//查看复盘数据
for (int i = 0; i < resume_array.length; i++) {
System.out.println(Arrays.toString(resume_array[i]));
}
}
}