稀疏数组的学习

在这里插入图片描述

需求:框内是一个12*13的二维数组,现在想将其存储起来。

因为有许多值是0,这就会有许多没有意义的数据。所以用普通的方法存储会很耗空间。

一、基本介绍

  • 当数组中大多数元素为零,可以使用稀疏数组来保存该数组,以此来达到节约空间的目的。

二、稀疏数组的结构

稀疏数组的列是固定的,为行(row),列(col),值(value)。

第一部分:原始数组的行数,列数,值(有效的值的个数)
余下的部分:原始数组中元素的行,列,值

在这里插入图片描述
如图:
稀疏数组的第0行为原数组的行数,列数,以及原数组的有效值的个数。(12,13,3)
第1行:原数组的行,列,以及值。(即是1行,2列,值是1)
第2行:即是3行,4列,值为2。
第3行:即是5行,4列,值为2。

前情提要
		//定义一个原始数组
        int sourceArray[][] = new int[12][13];
        sourceArray[1][2] = 1;
        sourceArray[3][4] = 2;
        sourceArray[5][4] = 2;

三、思路分析

1.将原数组转为稀疏数组

1.首先遍历原始数组,得到有效数据的个数sum。(sum+1为稀疏数组的长度)
2.根据sum创建稀疏数组SparseArray[sum+1][3]
3.将数据存入SparseArray[sum+1][3]
   (1)将原始数组的行数,列数,有效数据的个数分别存入SparseArray[0][0],SparseArray[0][1],SparseArray[0][2]。
   (2)遍历原始数组,将有效数据存入到稀疏数组中。

- 代码实现

        //遍历原始二维数组,得到非0的值的个数,
        int sum = 0;
        for (int i = 0; i < sourceArray.length; i++) {
            for (int j = 0; j < sourceArray[0].length; j++) {
                if (sourceArray[i][j] != 0) {
                    sum++;
                }
            }
        }
        
       //创建稀疏数组
        int sparseArray[][] = new int[sum + 1][3];

        //给稀疏数组赋值
        sparseArray[0][0] = sourceArray.length; //原始二维数组的行数
        sparseArray[0][1] = sourceArray[0].length; //原始二维数组的列数
        sparseArray[0][2] = sum;//原始数组中非0的个数

        //用于记录是第几个非0数
        int count = 0;
        //遍历数组,将非0的值存放到稀疏数组sparseArray中
        for (int i = 0; i < sourceArray.length; i++) {
            for (int j = 0; j < sourceArray[0].length; j++) {
                if (sourceArray[i][j] != 0) {
                    count++;
                    sparseArray[count][0] = i;
                    sparseArray[count][1] = j;
                    sparseArray[count][2] = sourceArray[i][j];
                }
            }
        }
2.将稀疏数组转成原始数组

1.首先获取稀疏数组第一行的数据,根据第一行数据来创建原始数组。
2.遍历读取余下的数据,并赋值给原始数组

- 代码实现
		//创建原始的二维数组
		int sourceArr[][] = new int[sparseArray[0][0]][sparseArray[0][1]];

		//遍历,将值赋给原始数组
        for(int i=1;i<sparseArray.length;i++){
           sourceArr[sparseArray[i][0]] [sparseArray[i][1]]=sparseArray[i][2];
        }

四、完整代码

package sparsearray;

public class SparseArray {

    public static void main(String[] args) {

        //定义一个原始数组
        int sourceArray[][] = new int[12][13];
        sourceArray[1][2] = 1;
        sourceArray[3][4] = 2;
        sourceArray[5][4] = 2;

        for (int[] row : sourceArray) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }


        //将原始数组转成稀疏数组
        //遍历原始二维数组,得到非0的值的个数,
        int sum = 0;
        for (int i = 0; i < sourceArray.length; i++) {
            for (int j = 0; j < sourceArray[0].length; j++) {
                if (sourceArray[i][j] != 0) {
                    sum++;
                }
            }
        }
        System.out.println(sum);
        System.out.println(sourceArray.length);

        //创建稀疏数组
        int sparseArray[][] = new int[sum + 1][3];

        //给稀疏数组赋值
        sparseArray[0][0] = sourceArray.length; //原始二维数组的行数
        sparseArray[0][1] = sourceArray[0].length; //原始二维数组的列数
        sparseArray[0][2] = sum;//原始数组中非0的个数

        //用于记录是第几个非0数
        int count = 0;
        //遍历数组,将非0的值存放到稀疏数组sparseArray中
        for (int i = 0; i < sourceArray.length; i++) {
            for (int j = 0; j < sourceArray[0].length; j++) {
                if (sourceArray[i][j] != 0) {
                    count++;
                    sparseArray[count][0] = i;
                    sparseArray[count][1] = j;
                    sparseArray[count][2] = sourceArray[i][j];
                }
            }
        }

        System.out.println("输出稀疏数组");
        for (int[] row : sparseArray) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }

        //将稀疏数组在恢复成原始二维数组
        //创建原始的二维数组
        int sourceArr[][] = new int[sparseArray[0][0]][sparseArray[0][1]];

        //遍历,将值赋给原始数组
        for(int i=1;i<sparseArray.length;i++){
           sourceArr[sparseArray[i][0]] [sparseArray[i][1]]=sparseArray[i][2];
        }


        System.out.println("输出原数组");
        for (int[] row : sourceArr) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }

    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章