稀疏数组
假设有这样一个二维数组:
0 0 0 0 0 1 0 2 0 0
8 0 0 0 0 0 9 0 6 0
-5 0 0 0 6 0 7 0 0 0
0 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 5 8
9 0 0 0 0 0 0 0 0 0
不难看出数组中有大量的 0存在,非0的值不多,仅仅12 个,但是这样的数组的大小为6*10,空间利用率仅为14/60=23.3%;于是考虑是否可以以更低的代价存储这些值。
考虑使用这样一个新数组,第一行存储原数组的大小和有效值个数,后续行存储有效值的坐标和值;原数组6*10,新稀疏数组 13*3,空间缩小了21,假设这样的数组有10个,100个,那么带来的收益将很可观。
6 10 12
0 5 1
0 7 2
1 0 8
1 6 9
1 8 6
2 0 -5
2 4 6
2 6 7
4 0 2
4 8 5
4 9 8
5 0 9
主要代码实现:
int [][]arr=new int[6][10];
int [][]arr2=new int[13][3];
int count=0;
arr2[0][0]=6;
arr2[0][1]=10;
arr2[0][2]=12;
for(int i=0;i<6;i++)
for(int j=0;j<10;j++)
if(arr[i][j]!=0){
arr2[++count][0]=i;
arr2[count][1]=j;
arr2[count][2]=arr[i][j];
}