您当前的位置: 首页 >  数据结构与算法

Bulut0907

暂无认证

  • 1浏览

    0关注

    346博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【数据结构与算法】稀释数组的介绍、和原始二维数组的相互转换

Bulut0907 发布时间:2022-09-09 09:38:23 ,浏览量:1

目录
  • 1. 稀释数组
    • 1.1 稀释数组的介绍
    • 1.1 稀释数组的处理方法
    • 1.3 稀疏数组的转换步骤和代码实现

1. 稀释数组 1.1 稀释数组的介绍

有时一个二维数组很多值都是0或同一个值,可以考虑使用稀释数组来保存数据

1.1 稀释数组的处理方法
  1. 记录数组一共有几行几列,有多少个不同的值(除去0或同一个值)
  2. 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模

如下图所示,将一个二维数组,用稀释数组来表示 稀释数组

1.3 稀疏数组的转换步骤和代码实现

二维数组转稀疏数组的步骤:

  1. 遍历原始的二维数组,得到原始数据的行数rowCount和列数columnCount,和有效数据的个数validCount
  2. 根据validCount创建稀疏数组sparseArray int[validCount + 1][3]
  3. 将rowCount、columnCount、validCount赋值给稀疏数组的第一行
  4. 再遍历二维数组将有效数据存入到稀疏数组

稀疏数组转原始的二维数组的步骤: 5. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组 6. 再读取稀疏数组后几行的数据,并赋值给原始的二维数组

代码实现

public class SparseArray {

    public static void main(String[] args) {

        // 创建原始的二维数组
        int[][] sourceArray = new int[10][12];
        sourceArray[1][2] = 1;
        sourceArray[5][4] = 2;
        sourceArray[7][8] = 3;

        // 原始的二维数组转稀疏数组
        int[][] sparseArray = sourceArray2SparseArray(sourceArray);

        // 输出稀疏数组
        System.out.println("得到稀疏数组为: ");
        for (int i = 0; i < sparseArray.length; i++) {
            System.out.printf("%d\t%d\t%d\t\n", sparseArray[i][0], sparseArray[i][1], sparseArray[i][2]);
        }
        System.out.println();

        // 稀疏数组恢复成原始的二维数组
        int[][] sourceArray2 = sparseArray2SourceArray(sparseArray);

        // 输出恢复后的二维数组
        System.out.println("恢复后的二维数组为:");
        for (int[] row : sourceArray2) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }
    }


    // 二维数组转稀疏数组
    public static int[][] sourceArray2SparseArray(int[][] sourceArray) {

        // 遍历原始的二维数组,得到原始数据的行数rowCount和列数columnCount,和有效数据的个数validCount
        int rowCount = sourceArray.length;
        int columnCount = 0;
        int validCount = 0;
        for (int i = 0; i < rowCount; i++) {
            columnCount = sourceArray[i].length;
            for (int j = 0; j < columnCount; j++) {
                if (sourceArray[i][j] != 0) {
                    validCount++;
                }
            }
        }

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


        // 将rowCount、columnCount、validCount赋值给稀疏数组的第一行
        sparseArray[0][0] = rowCount;
        sparseArray[0][1] = columnCount;
        sparseArray[0][2] = validCount;

        // 再遍历二维数组将有效数据存入到稀疏数组
        int rowIndex = 0; // rowIndex用于记录是第几个非0数据, 即稀疏数组的行index
        for (int i = 0; i < rowCount; i++) {
            for (int j = 0; j < columnCount; j++) {
                if (sourceArray[i][j] != 0) {
                    rowIndex++;
                    sparseArray[rowIndex][0] = i;
                    sparseArray[rowIndex][1] = j;
                    sparseArray[rowIndex][2] = sourceArray[i][j];
                }
            }
        }

        return sparseArray;
    }


    // 稀疏数组转二维数组
    public static int[][] sparseArray2SourceArray(int[][] sparseArray) {

        // 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
        int[][] sourceArray = new int[sparseArray[0][0]][sparseArray[0][1]];

        // 再读取稀疏数组后几行的数据,并赋值给原始的二维数组
        for (int i = 1; i < sparseArray.length; i++) {
            sourceArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
        }

        return sourceArray;
    }

}

运行程序,结果如下:

得到稀疏数组为: 
10	12	3	
1	2	1	
5	4	2	
7	8	3	

恢复后的二维数组为:
0	0	0	0	0	0	0	0	0	0	0	0	
0	0	1	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	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	2	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	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	0	
关注
打赏
1664501120
查看更多评论
立即登录/注册

微信扫码登录

0.0411s