如果一个数组中存了很多数据,但实际上只有几个有效期,其他都是无效值,例如下图,可以把这个数组的有效值压缩到另一个数组中,叫做稀松数组。这样减小了内存的空间,提高了IO效率

稀松数组

稀松数组的第一个元素存的是数组的所有行和所有列以及数组的有效值个数。其它元素存的是在哪行哪列存的什么值。

package pers.quan.array;

/**
 * 稀松数组
 */
public class MyArray {

    public static void main(String[] args) {
        int[][] num = new int[11][11];
        num[1][2] = 1;
        num[2][3] = 2;
//      记录有效值的个数
        int val = 0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0;j<11;j++) {
                if (num[i][j] != 0) {
                    val++;
                }
            }
        }

//        稀松数组
        int [][] xisong = new int[val+1][3];
        xisong[0][0] = 11;
        xisong[0][1] = 11;
        xisong[0][2] = val;

        int temp = 1;
//      把有效值存到稀松数组中
        for (int i = 0; i < 11; i++) {
            for (int j = 0;j<11;j++) {
                if (num[i][j] != 0) {
                    xisong[temp][0] = i;
                    xisong[temp][1] = j;
                    xisong[temp][2] = num[i][j];
                    temp++;
                }
            }
        }

//        打印稀松数组
        for (int i = 0; i < temp; i++) {
            for(int j =0;j < temp;j++) {
                System.out.print(xisong[i][j] + " ");
            }
            System.out.println();
        }

//        还原稀松数组
        int[][] num2 = new int[xisong[0][0]][xisong[0][1]];
        for (int i = 1; i <temp; i++) {
            num2[xisong[i][0]][xisong[i][1]] = xisong[i][2];
        }

//        打印还原后的数组
        for (int i = 0; i <xisong[0][0] ; i++) {
            for(int j =0 ;j<xisong[0][1];j++) {
                System.out.print(num2[i][j] + " ");
            }
            System.out.println();
        }
    }
}

练习:使用单链表来实习稀松数组: