跳到主要内容

认识稀疏数组

作用

当一个数组中大部分元素为 0 、或者为同一个值得数组时,可以使用稀疏数组来保存该数组

特点

  • 描述

    1) 记录数组一共有几行几列,有多少个不同的值
    2) 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
  • 图示

转换

二维数组转稀疏数组

  • 思路

    1. 遍历原始的二维数组,得到有效数据的个数 sum
    2. 根据 sum 就可以创建稀疏数组 sparseArr int[sum+1][3]
    3. 将二维数组的有效数据存入到稀疏数组
  • 实现

    :::details 点击查看代码

    /**
    * @description: 创建二维数组
    */
    function CreateDoubleArray(row, col) {
    let array = new Array();
    for (let i = 0; i < row; i++) {
    array[i] = new Array();
    for (let j = 0; j < col; j++) {
    array[i][j] = 0;
    }
    }
    return array;
    }
    /**
    * @description: 绘制二维数组
    */
    function DrawDoubleArray(array, row, col) {
    for (let i = 0; i < row; i++) {
    for (let j = 0; j < col; j++) {
    document.write(array[i][j] + " ");
    }
    document.write("<br/>");
    }
    }
    /**
    * @description: 创建稀疏数组
    */
    function CreateSparseArray(DenseArray, row, col) {
    let sum = 0; //记录密集数组中 不为0 的个数
    for (let i = 0; i < row; i++) {
    for (let j = 0; j < col; j++) {
    if (array[i][j] !== 0) {
    sum++;
    }
    }
    }
    let rowS = sum + 1;
    let colS = 3;
    let sparseArray = CreateDoubleArray(rowS, colS); //创建稀疏数组框架
    sparseArray[0][0] = row;
    sparseArray[0][1] = col;
    sparseArray[0][2] = sum;
    let count = 0; //记录行数
    for (let i = 0; i < row; i++) {
    for (let j = 0; j < col; j++) {
    if (array[i][j] !== 0) {
    count++;
    sparseArray[count][0] = i;
    sparseArray[count][1] = j;
    sparseArray[count][2] = array[i][j];
    }
    }
    }
    DrawDoubleArray(sparseArray,rowS,colS);
    }
    let array=CreateDoubleArray(10,10);
    array[2][3]=5;
    array[5][6]=29;
    array[9][3]=3;
    CreateSparseArray(array,10,10);

    :::

稀疏数组转换二维数组

  • 思路

    1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
    2.在读取稀疏数组后几行的数据,并赋给原始的二维数组
  • 实现

    :::details 点击查看代码

     /**
    * @description: 创建二维数组
    */
    function CreateDoubleArray(row, col) {
    let array = new Array();
    for (let i = 0; i < row; i++) {
    array[i] = new Array();
    for (let j = 0; j < col; j++) {
    array[i][j] = 0;
    }
    }
    return array;
    }
    /**
    * @description: 绘制二维数组
    */
    function DrawDoubleArray(array, row, col) {
    for (let i = 0; i < row; i++) {
    for (let j = 0; j < col; j++) {
    document.write(array[i][j] + " ");
    }
    document.write("<br/>");
    }
    }
    /**
    * @description: 创建稀疏数组
    */
    function CreateSparseArray(DenseArray, row, col) {
    let sum = 0; //记录密集数组中 不为0 的个数
    for (let i = 0; i < row; i++) {
    for (let j = 0; j < col; j++) {
    if (array[i][j] !== 0) {
    sum++;
    }
    }
    }
    let rowS = sum + 1;
    let colS = 3;
    let sparseArray = CreateDoubleArray(rowS, colS); //创建稀疏数组框架
    sparseArray[0][0] = row;
    sparseArray[0][1] = col;
    sparseArray[0][2] = sum;
    let count = 0; //记录行数
    for (let i = 0; i < row; i++) {
    for (let j = 0; j < col; j++) {
    if (array[i][j] !== 0) {
    count++;
    sparseArray[count][0] = i;
    sparseArray[count][1] = j;
    sparseArray[count][2] = array[i][j];
    }
    }
    }
    return sparseArray;
    }
    /**
    * @description: 稀疏转密集
    */
    function SparseToDense(sparseArray){
    let row=sparseArray[0][0];
    let col=sparseArray[0][1];
    let array=CreateDoubleArray(row,col);
    for(let i=1;i<sparseArray.length;i++){
    array[sparseArray[i][0]][sparseArray[i][1]]=sparseArray[i][2];
    }
    return array
    }
    let array = CreateDoubleArray(10, 10);
    array[2][3] = 5;
    array[5][6] = 29;
    array[9][3] = 3;
    let sparseArray=CreateSparseArray(array,10,10);
    let arrays=SparseToDense(sparseArray);
    DrawDoubleArray(arrays,10,10);

    :::

应用