1.稀疏算法的目的就是储存的时候,不用储存那么多,节省空间(时间换空间)。
稀疏数组:就是无效值(可以是规定值吧,相同的比较多)比较多,很稀疏,其实就是把原来的数组(这个数组有多个相同的值,这里是0,因为默认值为0,无值的情况默认0,不用设置值,而其他的值要设置值),通过规律来创建一个新的数组(值较少,且可以按一定规律还原为原数组),然后储存起来,然后。
思路如下:
原数组–》稀疏数组–》储存–》拿出来–》还原–》使用。
其中下面的表示原数组
下面的表示稀疏数组
代码(储存省略):
public class SparseArray2 {
public static void main(String[] args) {
int chessArr1[][]=new int[11][11];
chessArr1[1][2]=1;
chessArr1[2][3]=2;
for (int[] ints : chessArr1) {
System.out.println();
for (int anInt : ints) {
System.out.printf("%d\t",anInt);
}
}
/**
* 先获取有效值,这里是2个
* 对整个数组进行遍历,比较是否为0,来判断值
*/
int count=0;
for (int[] ints : chessArr1) {
for (int anInt : ints) {
if (anInt!=0) {
count++;
}
}
}
System.out.println("\n有效值的个数:"+count);
//设置稀疏数组的行与列
int sparseArr[][]=new int[count+1][3];
//todo 赋值
//第一行的值
sparseArr[0][0]=chessArr1.length;
sparseArr[0][1]=chessArr1[0].length;
sparseArr[0][2]=count;
//剩下行的值
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (chessArr1[i][j]!=0) {
sparseArr[i][0]=i;
sparseArr[i][1]=j;
sparseArr[i][2]=chessArr1[i][j];
}
}
}
//打印稀疏数组
System.out.println("打印稀疏数组");
for (int[] ints : sparseArr) {
System.out.println();
for (int anInt : ints) {
System.out.printf("%d\t",anInt);
}
}
//todo 恢复回去
//大致行与列
int renew[][]=new int[sparseArr[0][0]][sparseArr[0][1]];
//赋值
for (int i = 1; i < sparseArr.length; i++) {
int i0 = sparseArr[i][0];
int i1 = sparseArr[i][1];
int i2 = sparseArr[i][2];
renew[i0][i1]=i2;
}
System.out.println("\n打印稀疏数组还原");
for (int[] ints : renew) {
System.out.println();
for (int anInt : ints) {
System.out.printf("%d\t",anInt);
}
}
}
}