02. 稀疏数组
一、什么是稀疏数组
当一个数组大部分元素为 0,或者同一个值的数组时,可以使用稀疏数组来保存该数组。我们使用稀疏数组时,需要记录原数组一共有几行几列,有多少个不同的值。然后,我们把不同的值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。
二、压缩稀疏数组
二维数组转稀疏数组的思路如下:
- 遍历原始的二维数组,得到有效数据的个数 sum。
- 根据 sum 创建稀疏数组
int sparseArray[sum+1][3]
。 - 稀疏数组的第一行存放的原始二维数组的行、列和有效值。
- 将二维数组的有效数据存入到稀疏数组中。
/**
* @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;
}
三、解压稀疏数组
稀疏数组转原始的二维数组的思路如下:
- 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二位数组。
- 再读取稀疏数据后几行的数据,并赋给原始的二维数组即可。
/**
* @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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了