一:稀疏数组基本介绍
答:当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保护该数组
二:稀疏数组的工作原理:
- 记录数组一共有几行几列,有多少个不同的值
- 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
三:应用实例
五子棋游戏:
二维数组转换为稀疏数组:
Row | Clo | Val | |
---|---|---|---|
0 | 11 | 11 | 2 |
1 | 1 | 2 | 1 |
2 | 2 | 3 | 2 |
- 11行11列,有效数据有2个
- 1行2列,数值为1
- 2行3列,数值为2
二维数组转换为稀疏数组的思路:
- 遍历原始的二维数组,得到有效数据的个数sum
- 根据sum就可以创建稀疏数组sparseArr int{sum+1}{3}
- 将二维数组的有效数据存入到稀疏数组中
稀疏数组转换为二维数组的思路:
- 先读取稀疏数组第一行,根据第一行的数据,创建原始的二维数组
- 在读取稀疏书中后几行数据,并赋值原始的二维数组
四:代码实现
//先创建一个原始的二维数据11*11,
//0:表示没有棋子,1表示黑子,2表示白子
int[,] chese = new int[11, 11];
chese[1, 2] = 1;
chese[2, 4] = 2;
chese[7, 8] = 2;
chese[4, 9] = 1;
Console.WriteLine(“原始的二维数组:”);
for (int i = 0; i < Math.Sqrt(chese.Length); i++)
{
for (int j = 0; j < Math.Sqrt(chese.Length); j++)
{
Console.Write(“\t” + chese[i, j]);
}
Console.WriteLine(“”);
}
//第一步获取有效值的数据
int sum = 0;
for (int i = 0; i < Math.Sqrt(chese.Length); i++)
{
for (int j = 0; j < Math.Sqrt(chese.Length); j++)
{
if (chese[i, j] != 0)
{
sum++;
}
}
}
//第二步创建稀疏数组并赋值
//创建稀疏数组
int[,] res = new int[sum + 1, 3];
//给稀疏数组赋值
res[0, 0] = 11;
res[0, 1] = 11;
res[0, 2] = sum;
//遍历二维数组,将非零的值存入稀疏数组
int count = 0;
for (int i = 0; i < Math.Sqrt(chese.Length); i++)
{
for (int j = 0; j < Math.Sqrt(chese.Length); j++)
{
if (chese[i, j] != 0)
{
count++;
res[count, 0] = i;
res[count, 1] = j;
res[count, 2] = chese[i, j];
}
}
}
//打印稀疏数组的值
Console.WriteLine(“稀疏数组:”);
for (int i = 0; i < res.Length / 3; i++)
{
for (int j = 0; j < 3; j++)
{
Console.Write(“\t” + res[i, j]);
}
Console.WriteLine(“”);
}
[]: https://github.com/zc282840325/DataStructure/tree/master/数据结构-稀疏数组 “Github”