场景
棋盘游戏中,往往需要进行存档和读档,当棋盘上的棋子较多时,使用二维数组存储棋盘上棋子的位置和数量是一个不错的选择,但是,但棋子较少时,再用二维数组存储就比较浪费空间,这个时候就可以用稀疏数组来进行保存。
什么是稀疏数组
稀疏数组是一个有规定数据存储结构的二维数组,主要用来记录类似上面一个大部分元素为0或同一个值(以下统称为不为0)的二维数组,每一个稀疏数组的列数只有3列,行数则由有多少个不为0的数决定。它的第一行记录了二维数组的行数,列数,不为0的个数,从第二列开始则记录各个不为0数的位置(行和列)和值。例如上面的二维数组对应的稀疏数组为:
对比可知,原本需要存储11X11=121的数据,现在只需要3X3=9。
例子:
js代码如下:
/**
* 在控制台上打印二维数组
* @arr: 二维数组
*/
function print2Ary(arr) {
for(item1 of arr){
let row = ''
for(item2 of item1){
row += item2 + ' '
}
console.log(row)
}
}
/**
* 产生一个二维数组
*/
function product2Ary(row, col) {
let Arr = new Array(row).fill(0);
for(index in Arr){
Arr[index] = new Array(col).fill(0);
}
return Arr
}
// printAry(productAry());
/**
* 将二维数组转化成稀疏数组
* @arr: 二维数组
*/
function ary2Sparse(arr) {
let row = arr.length;
let col = arr[0].length;
let sum = 0;
//用来存储棋子的位置和值
let newArr = []
arr.forEach((item1,index1) => {
item1.forEach((item2,index2) => {
if(item2 !== 0) {
newArr.push([index1, index2, item2]);
sum++;
}
})
});
//将记录二维数组情况一列推到第一列
newArr.unshift([row, col, sum]);
return newArr
}
/**
* 将稀疏数组转换成二维数组
* @arr:稀疏数组
*/
function sparse2Ary(arr) {
let row = arr[0][0];
let col = arr[0][1];
let sum = arr[0][2];
let newArr = product2Ary(row, col);
for(var i = 1; i <= sum; i++) {
newArr[arr[i][0]][arr[i][1]] = arr[i][2];
}
return newArr
}
//二维数组
let arr = product2Ary(6, 7);
arr[0][3] = 22;
arr[0][6] = 15;
arr[1][1] = 11;
arr[1][5] = 17;
arr[2][3] = -6;
arr[3][5] = 39;
arr[4][0] = 91;
arr[5][2] = 28;
// 将二维数组转换成稀疏数组
let sparse = ary2Sparse(arr)
// 打印稀疏数组
print2Ary(sparse)
console.log("--------中间隔离线--------");
// 将稀疏数组转换成二维数组
let array = sparse2Ary(sparse);
// 打印二维数组
print2Ary(array);
写在最后: 若有误,请指正