为什么要使用系数数组
当有一个数组大部分元素都为0,这样存储这个数组就会消耗很多无用的资源,所以需要用稀疏数组进行储存
处理方式
- 记录数组一共有几行几列,有多少不同的值
- 把具体不同的值的元素行列及值记录在小规模的数组中,从而缩小规模
第一行存储这个数组有几行几列,有几个不同的值(例如图中多少个非0的值)
下面用于用存储第几行第几列存储的值为多少
转换思路
二维数组—>稀疏数组
- 遍历原始二维数组,记录有效值个数为sum
- 根据sum数创建 稀疏数组sparseArr int[sum+1][3]
- 将二维数组中的有效数据输入进稀疏数组里
稀疏数组—>二维数组
- 先读取稀疏数组第一列的数据,建立二维数组
- 读取稀疏数组后面的几行数据,并赋值给二维数组
public class SparseArr {
public static void main(String[] args) {
//先定义原始二维数组
int cherrArr1[][] = new int[11][11];
//初始化棋盘,将1,3;2,4赋值为1,其他为0
for(int row[] : cherrArr1)
{
for(int line : row)
{
line = 0;
}
}
cherrArr1[0][2] = 1;
cherrArr1[1][3] = 1;
//将棋盘打印出来
for(int row[] : cherrArr1)
{
for(int line : row)
{
System.out.print(line + "\t");
}
System.out.println();
}
//变为稀疏数组,第一行先获取行列数及有多少个不同的数据
int rowSum = 0;
int lineSum = 0;
int dataSum = 0;
for(int row[] : cherrArr1)
{
rowSum++;
for(int line : row)
{
lineSum++;
if(line != 0)
{
dataSum++;
}
}
}
lineSum = lineSum/rowSum;
//建立稀疏数组
int SparseArr[][] = new int[dataSum+1][3];
//定义在稀疏数组里的行数
int Srow = 0;
SparseArr[0][0] = rowSum;
SparseArr[0][1] = lineSum;
SparseArr[0][2] = dataSum;
int rowSum1 = 0;
for(int row[] : cherrArr1)
{
int lineSum1 = 0;
rowSum1++;
for(int line : row)
{
lineSum1++;
if(line != 0)
{
++Srow;
SparseArr[Srow][0] = rowSum1;
SparseArr[Srow][1] = lineSum1;
SparseArr[Srow][2] = line;
}
}
}
System.out.println();System.out.println();
for(int row[] : SparseArr)
{
for(int line : row)
{
System.out.print(line+"\t");
}
System.out.println();
}
//系稀疏数组还原
int[][] cherrArr2 = new int[SparseArr[0][0]][SparseArr[0][1]];
int cherrRow = 0;
for(int row[] : cherrArr2)
{
cherrRow++;
int cherrLine = 0;
for(int line : row)
{
cherrLine++;
line = 0;
}
}
for(int i=1; i<dataSum+1; i++)
{
cherrArr2[SparseArr[i][0]-1][SparseArr[i][1]-1] = 1;
}
for(int row[] : cherrArr2)
{
for(int line : row)
{
System.out.print(line + "\t");
}
System.out.println();
}
}
}
运行结果
0 0 1 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
11 11 2
1 3 1
2 4 1
0 0 1 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
对自己说的话:
今天是2020/1/16,今天是算法的第一天,在未来的一个假期中要把算法搞定,同时要努力备战考研,加油,你一定行的!!!我看好你尚焕然!这次就是你翻身的时候了。