数据结构与算法(一)——稀疏数组

104 阅读1分钟

稀疏数组(SparseArray)

二维数组在存储时会采用稀疏数组的方式来减少资源占用。

Example

假设有一个6*6的二维数组a,其中a[1][1]和a[2][2]有非零值,而其余位置均为0。那么在存储时就可以采用稀疏数组来减少冗余数据。

二维数组对应的稀疏数组如上图所示。其中第一行前两个元素分别代表原数组的行和列数,第三个元素是原二维数组有效数据个数(除0之外)。第二行代表第一个有效数据的行数、列数、具体数值。第三行代表第二个有效数据。

换言之,稀疏数组的行数由有效数据的个数决定,列数固定为三列,分别代表“行”、“列”、“值”。

将二维数组转化为稀疏数组的步骤

  • 获得二维数组有效数据个数(经历两次for循环遍历)
 int sum =0;
        for (int i = 0; i <chessArr1.length ; i++) {
            for (int j = 0; j <chessArr1[i].length ; j++) {
                if (chessArr1[i][j]!=0)
                    sum++;
            }
        }
  • 创建稀疏数组
int sparseArr[][]=new int[sum+1][3];
        sparseArr[0][0]=chessArr1.length;
        sparseArr[0][1]=chessArr1[0].length;
        sparseArr[0][2]=sum;
  • 给稀疏数组赋值
int count=0;
        for (int i = 0; i <chessArr1.length ; i++) {
            for (int j = 0; j <chessArr1[i].length ; j++) {
                if (chessArr1[i][j]!=0) {
                    count++;
                    sparseArr[count][0]=i;
                    sparseArr[count][1]=j;
                    sparseArr[count][2]=chessArr1[i][j];
                }
            }
        }
  • 稀疏数组转化为二维数组
int length1=sparseArr[0][0];
        int length2=sparseArr[0][1];
        int chessArr2[][]=new int[length1][length2];
        for (int i = 1; i <sparseArr.length ; i++) {
            chessArr2[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
        }

ref : 源码参照github仓库链接