javascript实现稀疏数组和普通二维数组的相互转换

场景

棋盘游戏
棋盘游戏中,往往需要进行存档和读档,当棋盘上的棋子较多时,使用二维数组存储棋盘上棋子的位置和数量是一个不错的选择,但是,但棋子较少时,再用二维数组存储就比较浪费空间,这个时候就可以用稀疏数组来进行保存。

什么是稀疏数组

稀疏数组是一个有规定数据存储结构的二维数组,主要用来记录类似上面一个大部分元素为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);

写在最后: 若有误,请指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值