02. 稀疏数组

一、什么是稀疏数组

  当一个数组大部分元素为 0,或者同一个值的数组时,可以使用稀疏数组来保存该数组。我们使用稀疏数组时,需要记录原数组一共有几行几列,有多少个不同的值。然后,我们把不同的值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。

稀疏数组

二、压缩稀疏数组

  二维数组转稀疏数组的思路如下:

  1. 遍历原始的二维数组,得到有效数据的个数 sum。
  2. 根据 sum 创建稀疏数组 int sparseArray[sum+1][3]
  3. 稀疏数组的第一行存放的原始二维数组的行、列和有效值。
  4. 将二维数组的有效数据存入到稀疏数组中。
/**
 * @brief 压缩稀疏数组
 * 
 * @param array 原始二维数组
 * @param row 原始二维数组的行
 * @param column 原始二维数组的列
 * @return int** 指向压缩成的稀疏数组的二维指针
 */
int ** GenerateSparseArray(int array[][7], int row, int column)
{
    // 1、遍历原始的二维数组,得到非0数组的个数
    int sum = 0;

    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < column; j++)
        {
            if (array[i][j] != 0)
            {
                sum++;
            }
        }
    }

    // 2、创建稀疏数组,申请一个sum行3列的整型数组  
    int ** spareArray = (int **)calloc((sum + 1), sizeof(int *));             // 分配行长度
    for (int i = 0; i < sum + 1; i++)
    {
        spareArray[i] = (int *)calloc(3, sizeof(int));
    }


    // 3、给稀疏数组的第一行赋值
    spareArray[0][0] = row;
    spareArray[0][1] = column;
    spareArray[0][2] = sum;

    // 4、遍历原始的二维数组,将非0的值存放到稀疏数组中
    int k = 0;
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < column; j++)
        {
            if (array[i][j] != 0)
            {
                spareArray[k + 1][0] = i;
                spareArray[k + 1][1] = j;
                spareArray[k + 1][2] = array[i][j];
                k++;
            }
        }
    }

    return spareArray;
}

三、解压稀疏数组

  稀疏数组转原始的二维数组的思路如下:

  1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二位数组。
  2. 再读取稀疏数据后几行的数据,并赋给原始的二维数组即可。
/**
 * @brief 解压稀疏数组
 * 
 * @param sparseArray 稀疏数据
 * @return int** 指向解压后的二维数组的指针
 */
int ** UnzipSparseArray(int ** sparseArray)
{
    // 1、申请一个二维数组
    int ** array = (int **)calloc(sparseArray[0][0], sizeof(int *));
    for (int i = 0; i < sparseArray[0][1] + 1; i++)
    {
        array[i] = (int *)calloc(sparseArray[0][1], sizeof(int));
    }

    // 2、遍历稀疏数组,将值赋给二维数组
    for (int i = 1; i <= sparseArray[0][2]; i++)
    {
        array[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
    }
  
    return array;
}
posted @ 2023-06-17 17:26  星光樱梦  阅读(160)  评论(0编辑  收藏  举报