文章目录
前言
当一个数组中大部分元素为0,或者为同一个值时,可以使用稀疏数组来保存该数组。
一、稀疏数组
稀疏数组可以用来压缩数组
处理方式:
记录数组一共有几行几列,有多少个要记录的值
把具有不同值的元素的行、列和值记录在一个小规模的数组中,从而缩小程序的规模
以数组中大多数的值为0举例:将非0值存储在稀疏数组中
稀疏数组第一行第一列,存储数组总行数,第一行第二列,存储数组总列数,第一行第三列,存储数组非0值的个数;
之后的每行,第一列存储非0值得行数,第二行存储非0值得列数,第三行存储值。
二、步骤
代码如下
public static void main(String[] args) {
// 1.创建一个原始数组
int[][] arr = new int[12][12];
// 初始化数组的三个值
arr[0][6] = 5;
arr[3][5] = 9;
arr[9][2] = 4;
//2.先输出一遍原始数组
System.out.println("******原始数组如下所示******");
for (int[] a : arr) {
for (int b : a) {
System.out.print(b+" ");
}
System.out.println();
}
//3将二维数组转化成稀疏数组
//3.1先遍历二维数组,得到非0数据的个数
int sum=0;//设定非0个数
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 12; j++) {
if(arr[i][j]!=0){
sum++;
}
}
}
//3.2创建对应的稀疏数组
System.out.println("非零个数为:"+sum);
int sparsArray[][] = new int[sum+1][3];
//3.3给稀疏数组赋值
sparsArray[0][0] = 12;//稀疏数组第一行第一列为arr的行数
sparsArray[0][1] = 12;//稀疏数组第一行第二列为arr的列数
sparsArray[0][2] = sum;//稀疏数组第一行第三列为arr中非0的个数
//3.4遍历二维数组,将非0的值存放在稀疏数组中
int count = 0;//设定稀疏数组的总个数
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 12; j++) {
if(arr[i][j]!=0){
count++;//稀疏数组第一行已经存放数据了
//当arr[i][j]非0时
sparsArray[count][0] = i;//将非0的行索引赋给稀疏数组
sparsArray[count][1] = j;//将非0的列索引赋给稀疏数组
sparsArray[count][2] = arr[i][j];//将非0的值赋给稀疏数组
}
}
}
//4.对系数数组输出
System.out.println("******稀疏数组如下所示******");
for (int[] a : sparsArray) {
for (int b : a) {
System.out.print(b+" ");
}
System.out.println();
}
//5.将稀疏数组恢复成原始的二维数组
//5.1根据稀疏数组的第一行的数据,创建原始的二维数组
int[][] newarr = new int[sparsArray[0][0]][sparsArray[0][1]];
//5.2读取稀疏数组后几行的数据,并赋给原始的二维数组
for(int i=1;i<sparsArray.length;i++){
newarr[sparsArray[i][0]][sparsArray[i][1]] = sparsArray[i][2];
}
//6.输出恢复后的二维数组
System.out.println("******恢复数组如下所示******");
for (int[] a : newarr) {
for (int b : a) {
System.out.print(b+" ");
}
System.out.println();
}
}