数据结构和算法
什么是稀疏数组?
稀疏数组就是将一个大规模的数组压缩,压缩后的这个数组就叫稀疏数组;
如果一个二维数组中,存放了许多同样的值,只有少数不同的值,就可以使用稀疏数组进行压缩,如果不加以压缩,把这个大规模的数组写入硬板中,那么将大大提高io操作。
重要理论:
- 记录数组中一共有几行几列,共有多少个不同的值
- 把具有不同的元素压缩到一个新的小规模数组中
- 固定只有三列:row col value
代码实现:
/**
* @author compass
* @version 1.0
* @date 2021-04-16 12:17
*/
public class SparseArray {
/**
* 当一个大的数组,有很多为0或者为null的值,可以使用稀疏数组进行压缩
* 1.记录数组中一共有几行几列,共有多少个不同的值
* 2.把具有不同的元素压缩到一个新的小规模数组中
* 固定只有三列:row col value
*/
public static void main(String[] args) {
// 创建一个二维数组 arr[行][列]
int[][] arrays = new int[10][10];
// 给二维数组赋值
arrays[0][8] = 2;
arrays[9][3] = 1;
arrays[5][3] = 2;
arrays[6][3] = 5;
System.out.println("----------------------------------原数组");
printArr(arrays);
System.out.println("----------------------------------稀疏数组");
//转为稀疏数组
int[][] sparseArray = toSparseArray(arrays);
printArr(sparseArray);
System.out.println("----------------------------------转回原数组");
//再将稀疏数组转回原数组
int[][] array = toArray(sparseArray);
printArr(array);
}
//将稀疏数组转回原数组
public static int[][] toArray(int[][] arr){
int[][] newArray = new int[arr[0][0]][arr[0][1]];
for (int i = 1; i < arr.length; i++) {
//将稀疏数组中的值赋值给原数组
newArray[arr[i][0]][arr[i][1]] = arr[i][2];
}
return newArray;
}
// 二维数组转稀疏数组
public static int[][] toSparseArray(int[][] arr){
// 计算出原数组中有多少个不为0的值
int count = 0;
int row = 1;
for (int i = 0; i <arr.length ; i++) {
for (int j = 0; j < arr[i].length ; j++) {
row = arr.length;
if (arr[i][j] != 0) count++;
}
}
//创建新数组(稀疏数组)
int[][] newArray = new int[count+1][3];
//第一行第一列为存放的行数:总共有不为0的值+1
newArray[0][0] = arr.length;
// 需要生成的列数:固定为3
newArray[0][1] = row;
// 存放一共有几个不为0的值
newArray[0][2] = count;
// 遍历原数组 将原数组的值赋值给稀疏数组
int newArrayIndex = 0; //用于记录是第几个非0数据
for (int i=0; i<arr.length; i++){
for (int j = 0; j <arr[i].length ; j++) {
if (arr[i][j] != 0){
newArrayIndex++;
// 赋值row
newArray[newArrayIndex][0]=i;
// 赋值col
newArray[newArrayIndex][1]=j;
//赋值 value
newArray[newArrayIndex][2]=arr[i][j];
}
}
}
return newArray;
}
// 打印二维数组的方法
public static void printArr(int[][] arr){
for (int i = 0;i<arr.length;i++){
for (int j = 0; j < arr[i].length ; j++) {
System.out.print(arr[i][j]+"\t");
}
System.out.println();
}
}
}