实际需求
就像五子棋盘,要保存这局棋。可以用二维数组,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);}
} }
```

