稀疏数组

182 阅读1分钟

试想用js表示一个矩阵,绝大多数的元素是相同的,只有少部分元素是不同的,这时候用二维数组将这个矩阵记录下来会耗费很多空间,本文主要展示如何用js将一个二维数组转化为稀疏数组。

稀疏数组

let moreArr = [
  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
  [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
  [0, 0, 2, 0, 0, 0, 8, 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  3
1   1   1
2   2   2
2   6   8
*/

let arr = [
  [],
  [],
  [],
  [],
  []
];
console.log(toLessArr(moreArr));
function toLessArr (arr) {
  // 参数是空数组
  if (arr.length == 0) {
    return arr;
  }

  // 参数的子数组length都为0
  let i = 0;
  for (let j = 0; j < arr.length; j++) {
    if (arr[j].length > 0) {
      i++;
    }
  }
  if (i === 0) {
    return arr;
  }

  // 参数不是标准的矩阵
  let flag = false;
  for (let j = 0; j < arr.length - 1; j++) {
    if (arr[j].length !== arr[j+1].length) {
      flag = true;
    }
  }
  if (flag) {
    return console.log("请输入正确的矩阵!");
  }
  // --------------------
  let lessArr = [];
  for (let j = 0; j < arr.length; j++) {
    lessArr.push([]);
  }

  // 记录表盘信息
  let sum = 0;
  for (let j = 0; j < arr.length; j++) {
    for (let h = 0; h < arr[j].length; h++) {
      if (arr[j][h] !== 0) {
        sum++;
      }
    }
  }
  lessArr[0][0] = arr.length;
  lessArr[0][1] = arr[0].length;
  lessArr[0][2] = sum;

  // 将原数组存在稀疏数组中
  let count = 0;
  for (let j = 0; j < arr.length; j++) {
    for (let h = 0; h < arr[j].length; h++) {
      if (arr[j][h] !== 0) {
        count++;
        lessArr[count].push(j);
        lessArr[count].push(h);
        lessArr[count].push(arr[j][h]); 
      }
    }
  }

  return lessArr.filter(item => item.length > 0);
}

2.png