此篇文章是我在b站上学习韩顺平老师的数据结构时而做的笔记,此篇文章中如有错误,敬请指正,感谢!
稀疏数组(SparseArray)
1、介绍:当一个数组大部分元素为0或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
注意:稀疏数组也是一个二维数组
2、处理方式:
①记录数组共有几行几列,有多少的不同值
②把具有不同值的元素的行列及值记录在一个小规模数组中,从而缩小程序的规模
如上图,左侧为原数组,共占据空间为7×5=35;右侧为压缩后的稀疏数组,共占据7×3=21,变为稀疏数组后所占空间变小。
右侧稀疏数组第一行表示原数组共有多少行多少列以及有多少非零数,如上图原数组共有7行5列,有6个非零数据,对应的稀疏数组[0]这一行的数据分别为7 5 6。
稀疏数组的其他行表示第几行和第几列处的值为多少,如上图的[1]这一行中的数据表示在原数组的第0行第4列处的值为5
3、转换方式:
1)二维数组转为稀疏数组:
①遍历二维数组,得到有效数据的个数sum。
②根据sum创建稀疏数组,int[sum+1][3]。
(稀疏数组的列是固定的3,因为稀疏数组只有row、col和value这三列的数据)
③将二维数组的有效数据存入到稀疏数组中。
2)稀疏数组转为二维数组:
①读取二维数组的第一行定义出原始数组int[row][col]。
②读取稀疏数组后几行的数据出赋值到二维数组的相应位置。
4、代码演示:
public class SparseArray {
public static void main(String[] args) {
int arr[][] = new int[11][11];
arr[1][2] = 1;
arr[2][4] = 2;
// 查看二维数组的情况:
System.out.println("原始数组:");
for(int i=0;i<arr.length;i++) {
for(int j = 0;j<arr[0].length;j++) {
System.out.print("\t"+arr[i][j]);
}
System.out.println();
}
// 转化为稀疏数组---------------------------------------------------------------------------
System.out.println("稀疏数组:");
// 1、查找出有效数据sum
int sum = 0;
for(int i = 0;i<arr.length;i++) {
for(int j = 0;j<arr[0].length;j++) {
if(arr[i][j]!=0) {
sum++;
}
}
}
// System.out.println(sum);
// 2、创建稀疏数组
int sparseArr[][] = new int[sum+1][3];
sparseArr[0][0] = arr.length;
sparseArr[0][1] = arr[0].length;
sparseArr[0][2] = sum;
//3、将数据填充到稀疏数组中去
int count = 0;
for(int i = 0;i<arr.length;i++) {
for(int j = 0;j<arr[0].length;j++) {
if(arr[i][j]!=0) {
count++; //从第二行开始,第一行已经手动设置了在上面
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = arr[i][j];
}
}
}
// 查看是否成功
for(int i=0;i<sparseArr.length;i++) {
for(int j = 0;j<sparseArr[0].length;j++) {
System.out.print("\t"+sparseArr[i][j]);
}
System.out.println();
}
// 恢复成原始数组---------------------------------------------------------------------------
System.out.println("恢复成原始数据:");
// 1、创建原始数组:
int arr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
//2、将稀疏数组数据转化为原始数组数据:
for(int i = 1;i<sparseArr.length;i++) { //需从第二行开始恢复,稀疏数组第一行是原数组的总体数量
arr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
//查看是否成功
for(int i = 0;i<arr2.length;i++) {
for(int j = 0;j<arr2[0].length;j++) {
System.out.print("\t"+arr2[i][j]);
}
System.out.println();
}
}
}
运行后的图片: