数据结构-稀疏数组

一:稀疏数组基本介绍

答:当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保护该数组

二:稀疏数组的工作原理:

1573527796664

  1. 记录数组一共有几行几列,有多少个不同的值
  2. 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模

三:应用实例

五子棋游戏:

1573527984103

二维数组转换为稀疏数组:

Row Clo Val
0 11 11 2
1 1 2 1
2 2 3 2
  • 11行11列,有效数据有2个
  • 1行2列,数值为1
  • 2行3列,数值为2

二维数组转换为稀疏数组的思路:

  1. 遍历原始的二维数组,得到有效数据的个数sum
  2. 根据sum就可以创建稀疏数组sparseArr int{sum+1}{3}
  3. 将二维数组的有效数据存入到稀疏数组中

稀疏数组转换为二维数组的思路:

  1. 先读取稀疏数组第一行,根据第一行的数据,创建原始的二维数组
  2. 在读取稀疏书中后几行数据,并赋值原始的二维数组

四:代码实现

//先创建一个原始的二维数据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”