小白的数据结构学习—1.稀疏数组

139 阅读3分钟

数据结构之稀疏数组篇

比较基本的定义是当二维数组中的大多数元素为零,将其转换为稀疏数组,在进行操作时可以极大的降低内存的消耗和节约时间

  1. 二维数组转换为稀疏数组如下图所示:

  2. 代码和结果如下所示

          //新建一个二维数组
        int tdArray[][]=new int[6][10];
        tdArray[1][1]=1;
        tdArray[2][2]=2;
        tdArray[3][3]=3;
        tdArray[2][5]=4;
        System.out.println("-----------二维数组---------------");
        for (int[] row : tdArray) {
            for (int data:row){
                System.out.print(data+" ");
            }
            System.out.println();
        }
    

此时的输出结果1为:

-----------二维数组---------------

0 0 0 0 0 0 0 0 0 0

0 1 0 0 0 0 0 0 0 0

0 0 2 0 0 4 0 0 0 0

0 0 0 3 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

二维数组转换为稀疏数组的代码如下:

    /*二维数组转换为稀疏数组*/
    public static int[][]Td2Sparse(int[][]tdArray){
        //sum值为二维数组中的值不为0的个数
        int sum=0;
        for (int i = 0; i <tdArray.length; i++) {
            for (int j=0;j<tdArray[i].length;j++){
                if(tdArray[i][j]!=0){
                    sum++;
                }
            }
        }
        //稀疏数组第0行为二维数组的总行数,总列数和二维数组中不为0的个数
        int [][]sparseArray=new int[sum+1][3];
        sparseArray[0][0]=tdArray.length;
        sparseArray[0][1]=tdArray[0].length;
        sparseArray[0][2]=sum;
        int num=0;
        num从第一行开始,记录每一个元素的行列值
        for (int i = 0; i <tdArray.length; i++) {
            for (int j=0;j<tdArray[i].length;j++){
                if(tdArray[i][j]!=0){
                    num++;
                    sparseArray[num][0]=i;
                    sparseArray[num][1]=j;
                    sparseArray[num][2]=tdArray[i][j];

                }
            }
        }
        return sparseArray;
    }
    System.out.println("-----------二维数组转换为稀疏数组---------------");
        int[][] sparseArray = Td2Sparse(tdArray);
        for (int[] row : sparseArray) {
            for (int data:row){
                System.out.print(data+" ");
            }
            System.out.println();
        }

此时的输出结果2为:

-----------二维数组转换为稀疏数组---------------

6 10  4

1  1   1

2  2  2

2  5  4

3  3  3

稀疏数组转换为二维数组的代码如下:
 /*稀疏矩阵转换为二维数组*/
    public static int[][]Sparse2Td(int[][]sparseArray){
    //读取稀疏数组的(0,0)和(0,1)作为二维数组的行和列
        int[][]tdarray=new int[sparseArray[0][0]][sparseArray[0][1]];
        //将稀疏数组的每一行(行,列,值)读入二维数组
        for (int i=1;i<sparseArray.length;i++){
            tdarray[sparseArray[i][0]][sparseArray[i][1]]=sparseArray[i][2];
        }
        return tdarray;
    }

     System.out.println("-----------稀疏数组转换为二维数组---------------");
        int[][] tdArray2 = Sparse2Td(sparseArray);
        for (int[] row : tdArray2) {
            for (int data:row){
                System.out.print(data+" ");
            }
            System.out.println();
        }

此时输出结果3为:

-----------稀疏数组转换为二维数组---------------

0 0 0 0 0 0 0 0 0 0

0 1 0 0 0 0 0 0 0 0

0 0 2 0 0 4 0 0 0 0

0 0 0 3 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

输出结果3和1的结果一致。

最后为全文的所有代码:

package com.xu.sparseArray;
/*稀疏数组
* 1.二维数组转换为稀疏矩阵
* 2.稀疏数组转换为二维数组
* */
public class SparseArray {
    public static void main(String[] args) {
        //新建一个二维数组
        int tdArray[][]=new int[6][10];
        tdArray[1][1]=1;
        tdArray[2][2]=2;
        tdArray[3][3]=3;
        tdArray[2][5]=4;
        System.out.println("-----------二维数组---------------");
        for (int[] row : tdArray) {
            for (int data:row){
                System.out.print(data+" ");
            }
            System.out.println();
        }
        System.out.println("-----------二维数组转换为稀疏数组---------------");
        int[][] sparseArray = Td2Sparse(tdArray);
        for (int[] row : sparseArray) {
            for (int data:row){
                System.out.print(data+" ");
            }
            System.out.println();
        }
        System.out.println("-----------稀疏数组转换为二维数组---------------");
        int[][] tdArray2 = Sparse2Td(sparseArray);
        for (int[] row : tdArray2) {
            for (int data:row){
                System.out.print(data+" ");
            }
            System.out.println();
        }

    }
    /*矩阵转换为稀疏矩阵*/
    public static int[][]Td2Sparse(int[][]tdArray){
        int sum=0;
        for (int i = 0; i <tdArray.length; i++) {
            for (int j=0;j<tdArray[i].length;j++){
                if(tdArray[i][j]!=0){
                    sum++;
                }
            }
        }
        int [][]sparseArray=new int[sum+1][3];
        sparseArray[0][0]=tdArray.length;
        sparseArray[0][1]=tdArray[0].length;
        sparseArray[0][2]=sum;
        int num=0;
        for (int i = 0; i <tdArray.length; i++) {
            for (int j=0;j<tdArray[i].length;j++){
                if(tdArray[i][j]!=0){
                    num++;
                    sparseArray[num][0]=i;
                    sparseArray[num][1]=j;
                    sparseArray[num][2]=tdArray[i][j];

                }
            }
        }
        return sparseArray;
    }
    /*稀疏矩阵转换为二维数组*/
    public static int[][]Sparse2Td(int[][]sparseArray){
        int[][]tdarray=new int[sparseArray[0][0]][sparseArray[0][1]];
        for (int i=1;i<sparseArray.length;i++){
            tdarray[sparseArray[i][0]][sparseArray[i][1]]=sparseArray[i][2];
        }
        return tdarray;
    }
}