实际需求
就像五子棋盘,要保存这局棋。可以用二维数组,1表示黑棋,2表示蓝棋,0表示空位。但是问题来了,我现在就两个棋子,其他的都是空位,而这二维数组0太多了,保存下来占用空间。要是这棋盘很大,占用空间更明显。
基本介绍
当一个数组的大部分元素为0或者为同一个值。可以使用稀疏数组来保存该数组。稀疏数组只有在数据稀疏的情况下有优势。
稀疏数组的处理方法
- 记录数组一共有几行几列,多少个不同的值
- 把具有不同值得元素的行列以及值记录在一个小规模的数组中,从而缩小程序的规模。这个小规模的数组就是稀疏数组。
原始数组像这样。保存原始数组就要保存15*15=225个数据。
稀疏数组像这样,前两列记录数据的坐标,第三列记录数据,这样只用保存8*3=24个数据。
稀疏数组的转换思路
稀疏数组行数不确定,列是固定的3列,第一列记录行坐标,第二列记录列坐标,第三列记录值。
稀疏数组第一行记录原始数组的行,列,有多少个有效数。
二维数组转稀疏数组的思路
- 遍历原始的二维数组,得到有效数据的个数s
- 根据s就可以创建稀疏数组sparseArr
int[s+1][3]
- 稀疏数组第一行记录原始数组的行数和列数,还有有效数据个数
-
稀疏数组转原始二维数组的思路
先读取稀疏数组的第一行,根据第一行的数据,创建原始二维数组,空数组
-
代码实现
```csharp using System; namespace ConsoleApp1 { class Program {
static void Main(string[] args)
{
//原始二维数组
int[,] Arr = new int[15, 15];
Arr[1, 2] = 1;
Arr[2, 4] = 2;
Arr[3, 7] = 4;
PrintArr(Arr);
ArrToSparseArr(Arr);
}
//打印二维数组
static void PrintArr(int[,] Arr)
{
for (int i = 0; i < Arr.GetLength(0); i++)
{
for (int t = 0; t < Arr.GetLength(1); t++)
{
Console.Write(Arr[i, t]);
}
Console.WriteLine("\r");
}
}
//原始数组转稀疏数组
static void ArrToSparseArr(int[,] Arr)
{
//1.先遍历二维数组得到非0有效数据个数
int sum = 0;//有效数据个数
for (int i = 0; i < 15; i++)
{
for (int t = 0; t < 15; t++)
{
if (Arr[i, t] != 0)
sum++;
}
}
//2.创建稀疏数组
int[,] sparseArr = new int[sum + 1, 3];
sparseArr[0, 0] = 15;
sparseArr[0, 1] = 15;
sparseArr[0, 2] = sum;
//3.遍历二维数组,将非0的有效数存放到稀疏数组中去
int count = 0;//用来记录是第几个非0有效数
for (int i = 0; i < 15; i++)
{
for (int t = 0; t < 15; t++)
{
if (Arr[i, t] != 0)
{
count++;
sparseArr[count, 0] = i;
sparseArr[count, 1] = t;
sparseArr[count, 2] = Arr[i, t];
}
}
}
//打印稀疏数组
Console.WriteLine("稀疏数组如下");
PrintArr(sparseArr);
//稀疏数组转原始数组
SparseArrToArr(sparseArr);
}
//稀疏数组转原始数组
static void SparseArrToArr(int[,] SparseArr)
{
//1.通过稀疏数组第一行创建原始数组
int[,] Arr = new int[SparseArr[0, 0], SparseArr[0, 1]];
//2.遍历稀疏数组剩下的行,赋值给原始数组
for(int i = 1; i < SparseArr.GetLength(0); i++)
{
Arr[SparseArr[i, 0], SparseArr[i, 1]] = SparseArr[i, 2];
}
//打印原始数组
PrintArr(Arr);
}
} }
```