数据结构(Java)——稀疏数组
一、稀疏数组概念
稀疏矩阵(英语:sparse matrix),在数值分析中,是其元素大部分为零的矩阵。反之,如果大部分元素都非零,则这个矩阵是稠密的。在计算机中以数组方式存储矩阵,即二维数组对应数学上的矩阵概念。
在使用计算机存储和操作稀疏矩阵时,经常需要修改标准算法以利用矩阵的稀疏结构。由于其自身的稀疏特性,通过压缩可以大大节省稀疏矩阵的内存代价。
压缩的原理是:记录行数、列数和有效值个数以及有效值在一个小型二维数组中。
二、稀疏数组示例
原始数组数据:
[0] | [1] | [2] | [3] | [4] | [5] | |
---|---|---|---|---|---|---|
[0] | 0 | 0 | 0 | 0 | 0 | 0 |
[1] | 1 | 0 | 0 | 0 | 0 | 0 |
[2] | 0 | 0 | 0 | 0 | 0 | 0 |
[3] | 0 | 0 | 0 | -4 | 0 | 0 |
[4] | 0 | 0 | 0 | 0 | 0 | 0 |
[5] | 0 | 0 | 0 | 0 | 0 | 7 |
对应稀疏数组:
行 | 列 | 值 | |
---|---|---|---|
[0] | 6 | 6 | 3 |
[1] | 1 | 0 | 1 |
[2] | 3 | 3 | -4 |
[3] | 5 | 5 | 7 |
由以上两个表格内容可知,该稀疏数组[0]行表示原数组是有三个有效值的六行六列二维数组。后三行则是具体数据。
三、稀疏数组存储还原代码实现
啥也不说了,上代码!算了还是多说一句,代码是人,注解就是命!
public class SparseMatrix
{
public static void main( String[] args )
{
//创建一个6*6的二维数组
int[][] array1=new int[6][6];
array1[1][0]=1;
array1[3][3]=-4;
array1[5][5]=7;
System.out.println("输出原始数组数据:");
for(int[] ints:array1){
for(int anInt:ints){
System.out.print(anInt+"\t");
}
System.out.println();
}
System.out.println("=====================");
//原始数组转换为稀疏数组保存
//1.获取有效值的个数
int sum=0;
for(int i=0;i<array1.length;i++){
for(int j=0;j<array1.length;j++){
if(array1[i][j]!=0)
sum++;
}
}
System.out.println("有效值个数:"+sum);
//2.创建一个稀疏数组
//sum+1:总行数。即有效值个数加上存放行、列、有效值个数的一行
int[][] array2=new int[sum+1][3];
array2[0][0]=6;//6行
array2[0][1]=6;//6列
array2[0][2]=3;//有效值个数
//3.遍历原始数组,将有效值存入稀疏数组中
int count=0;//对应有效值个数
for(int i=1;i<array1.length;i++){
for(int j=0;j<array1.length;j++){
if(array1[i][j]!=0){
count++;
array2[count][0]=i;
array2[count][1]=j;
array2[count][2]=array1[i][j];
}
}
}
System.out.println("输出稀疏数组:");
for(int i=0;i<array2.length;i++){
for(int j=0;j<3;j++){
System.out.print(array2[i][j]+"\t");
}
System.out.println();
}
System.out.println("======================");
//实现稀疏数组的读取
//1.创建一个用来读取稀疏数组的数组,已知稀疏数组第[0]行前两个值分别为行列数
int[][] array3=new int[array2[0][0]][array2[0][1]];
//还原有效值位置,且已知有效值在稀疏数组最后一列
//注意此处需要从i=1开始遍历,因为稀疏数组第[0]行存储行数、列数、有效值个数
for(int i=1;i<array2.length;i++){
array3[array2[i][0]][array2[i][1]]=array2[i][2];
}
//2.打印出来
System.out.println("输出还原后的数组:");
for(int i=0;i<array3.length;i++){
for(int j=0;j<array3.length;j++){
System.out.print(array3[i][j]+"\t");
}
System.out.println();
}
}
}
输出结果: