Java数据结构与算法之稀疏数组

1、稀疏数组定义

稀疏数组(sparse array)是一种只为数组中的非零元素分配内存的特殊类型数组,内存中存储了数组中非零元素的下标和值。

2、稀疏数组与二维数组

  1. 普通二维数组
    Java数据结构与算法之稀疏数组_第1张图片

  2. 二维数组转稀疏数组后
    Java数据结构与算法之稀疏数组_第2张图片

  3. 稀疏数组图解
    Java数据结构与算法之稀疏数组_第3张图片
    将二维数组转称稀疏数组之后,在稀疏数组中存储的是二维数组中所有非0(不一定是非0,在实际应用中,可能是数组中大量存在的并且分布没有规律的元素)元素的下标和值。

    稀疏数组的列数是固定的,只有3列:

    • 第一列存放的是二维数组中有效元素的行坐标;
    • 第二列存放的是二维数组中有效元素的列坐标;
    • 第三列存放的是二维数组中有效元素的值;

    稀疏数组的行数根据有效元素的个数来确定,一般为有效元素的个数+1,因为在稀疏数组中第一行(下标为0)依次存放的是二维数组的总行数、总列数、有效元素个数。所以真正存放二维数组中有效元素的是从第2行开始的(下标为1).

3、代码实现(Java)

package com.lee.sparsearray;

public class SparseArray {
    public static void main(String[] args) {

        //新建二维数组并给其中部分赋值
        int[][] arr1 = new int[11][11];
        arr1 [1][2] = 1;
        arr1 [2][3] = 2;
        arr1 [3][4] = 2;
        arr1 [6][7] = 1;

        //输出原始二维数组
        System.out.println("原始二维数组");
        for(int[] row : arr1 ){
            for(int data : row){
                System.out.print(data + "   ");
            }
            System.out.println();
        }

        //遍历二维数组查看有多少个有效元素
        int sum = 0;
        for(int[] row : arr1 ){
            for(int data : row){
                if(data != 0){
                    sum++;
                }
            }
        }

        //创建稀疏数组,并存放稀疏数组第一行的值
        int[][] sparseArr = new int[sum + 1][3];
        sparseArr[0][0] = arr1 .length;
        sparseArr[0][1] = arr1 [0].length;
        sparseArr[0][2] = sum;

        //遍历二维数组,将有效元素存放到稀疏数组中
        int count = 0;
        for(int i = 0; i < arr1 .length; i++){
            for(int j = 0; j < arr1 [i].length; j++){
                if(arr1 [i][j] != 0){
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = arr1 [i][j];
                }
            }
        }

        //输出稀疏数组
        System.out.println("稀疏数组");
        for(int i = 0; i < sparseArr.length; i++){
            for(int j = 0; j < 3; j++){
                System.out.print(sparseArr[i][j] + "  ");
            }
            System.out.println();
        }

        //从稀疏数组恢复到二维数组
        int[][] arr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
        for(int i = 1; i < sparseArr.length; i++){
            arr2 [sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }

        //打印恢复后的二维数组
        System.out.println("恢复后的二维数组");
        for(int[] row : arr2 ){
            for(int data : row){
                System.out.print(data + "   ");
            }
            System.out.println();
        }

    }
}

你可能感兴趣的:(数据结构与算法-Java)