稀疏数组
什么是稀疏数组?
0 0 1 1 1 1 1 1 1 1 0 0
0 0 0 0 0 1 1 0 0 0 0 0
0 0 0 0 0 1 1 0 0 0 0 0
0 0 0 0 0 1 1 0 0 0 0 0
0 0 0 0 0 1 1 0 0 0 0 0
0 0 0 0 0 1 1 0 0 0 0 0
0 0 0 0 0 1 1 0 0 0 0 0
0 0 0 0 0 1 1 0 0 0 0 0
0 0 0 0 0 1 1 0 0 0 0 0
0 0 0 0 0 1 1 0 0 0 0 0
0 0 1 1 1 1 1 1 1 1 0 0
字符集的编写原理:
字符在显示屏的显示就是0,1的组合,然后为其上色,以0或者1为显色标准,用编码集调用来呈现不同的字符在显示屏中。那么当大量的字符集共同出现时,(每个字符的大小都是固定的),那么单个字符的大小在整个显示屏中的宏观中就变成了最小单位,那么由此可想,数据量的庞大,而整个屏幕充斥着不计其数的无效数字,如0,大量的0出现,占用的内存其实是很大的。
那么,如何规避这个问题呢?稀疏数组的出现,就很好的解决了普通数组中大量无效却又必须出现的相同的值的问题!
0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
当一个数组储存类似于棋盘格之类的大量数据,如上图,这便是由0做界线,1,2为黑白棋的棋盘。在代码中,界线0只是黑白棋位置的一个标准,其实是无用的,但是黑白棋1,2又必须依据界线0来存放。那么稀疏数组来了!
//稀疏数组的规则
//稀疏数组是一个二维数组,3列是固定不变的,行数是由普通数组来决定的
//将上图棋盘绘制成二维普通数组
int[][] array1=new int[11][11];
array1[1][2]=1;
array1[2][3]=2;
//此时普通数组的有效值为array1[1][2]和array1[2][3]这两个值
//其余的都为int的默认值0,0也是占用堆中内存的,不必要的消耗
//row:有效值的行坐标 colum:有效值的纵坐标 value:该有效值坐标下的值
row colum value
//----------稀疏二维数组--------------
1 2 1
2 3 2
//将该稀疏图形数组转换为代码表示
int trueValueCount=array1[i][j]中不等于0的数的个数 //有效值的个数,几个有效值,稀疏数组就有几行
int[][] array2=new int[trueValueCount][3]
//i,j都是在有 有效值的情况下遍历的,也就是有效值的横纵下标分别赋给稀疏数组的第一第二列,然后将有效值赋给第三列
array2[i][0]=i;
array2[i][1]=j;
array2[i][2]=array1[i][j];
这样循环赋值后,出来的稀疏数组中没有默认值,也就是都是有效值,极大的提高了对内存的利用率。
当然,也可以由稀疏数组还原为普通数组。
//11*11棋盘格 1-black 2-white
int[][] array1=new int[11][11];
array1[0][2]=1;
array1[1][3]=2;
//输出棋盘格
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
System.out.print(array1[i][j]+"\t");
}
System.out.println();
}
//转换为稀疏数组
/*
稀疏数组的 row colum value
*/
//1.原数组中有多少有效值
int count=0;
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
if (array1[i][j]!=0){
count++;
}
}
}
System.out.println("有效值:"+count);
//根据原数组中的有效值创建稀疏数组
int[][] array2=new int[count+1][3];
array2[0][0]=array1.length;
array2[0][1]=array1[0].length;
array2[0][2]=count;
//为稀疏数组赋值
int count2=0;
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
if (array1[i][j]!=0){
count2++;
array2[count2][0]=i;//原数组的横坐标赋值给稀疏数组的第一列
array2[count2][1]=j;//原数组的纵坐标赋值给稀疏数组的第二列
array2[count2][2]=array1[i][j];//原数组的有效值赋值给稀疏数组的第三列
}
}
}
for (int i = 0; i < array2.length; i++) {
System.out.println(array2[i][0]+"\t"+array2[i][1]+"\t"+array2[i][2]);
}
//还原原数组
int[][] array3=new int[array2[0][0]][array2[0][1]];
for (int i = 1; i < array2.length; i++) {
for (int j = 0; j < array2[i].length; j++) {
array3[array2[i][0]][array2[i][1]]=array2[i][j];
}
}
for (int[] ints : array3) {
for (int i : ints) {
System.out.print(i+"\t");
}
System.out.println();
}