栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

1 - 稀疏数组

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

1 - 稀疏数组

稀疏数组 [Sparse Array]
  • 1 - 观看例子
  • 2 - 引出问题
  • 3 - 稀疏数组
  • 4 - 二维数组与稀疏数组相互转换
    • 思路
    • 代码实现

1 - 观看例子

大家都玩过五子棋吧,黑方或白方只要有一方棋子先连上五个就为胜利

棋盘与棋子如图:

那么转换为Java中的二维数组就为:

0:表示没有棋子
1:表示黑棋
2:表示白棋

2 - 引出问题

可以看到二维数组中很多值都是 0,因此记录了很多没有意义的数据。

3 - 稀疏数组

当一个二维数组中 大部分元素为 0(或是同一个值) 时,可以使用 稀疏数组 来保存该数组

处理方法

  1. 记录数组一共有几行几列,有多少不同的值
  2. 把具有不同值元素 的行列值 记录在一个 小规模的数组 中,从而缩小程序的规模

如图:
图一:

图二:

图一是原始的二维数组 6x7 = 42 个格子,图二是稀疏数组 9 x 3 = 27 个格子
[0]:记录了棋盘的大小,6 行 7 列,棋盘上有 8 个不为 0 的值
其他行:分别记录每一个非 0 值的所在行、所在列、值
比如 [1]:在第 0 行第 3 列上有一个 22(这里的行列都是下标)
可以看到原始 42 个数据,压缩成 27 个数据。一定程度上压缩了数据。

4 - 二维数组与稀疏数组相互转换 思路

二维数组转稀疏数组:

  1. 遍历原始的二维数组,得到有效个数sum
  2. 根据 sum 创建 稀疏数组 sparseArr = int[sum + 1][3]
  3. 将二维数据的有效数据存入到稀疏数组中(从第 2 行开始存储)
  4. 最后将棋盘大小和有效个数写入第一行

稀疏数组转二维数组:

  1. 读取第一行数据,根据棋盘大小,创建原始的二维数组 chessArr = int [11][11]
  2. 从第二行开始,将有效数据还原到原始数组中
代码实现
package com.krismile.ghf.array;


public class SparseArray {
    public static void main(String[] args) {
        // 二维数组转稀疏数组
        int[][] chessArray = new int[10][10];
        chessArray[1][1] = 1;
        chessArray[1][2] = 2;
        chessArray[3][2] = 1;
        chessArray[2][2] = 1;
        chessArray[6][2] = 2;
        System.out.println("原始数组:");
        printlnChessArray(chessArray);
        System.out.println("稀疏数组:");

        int[][] sparseArray = chessToSparse(chessArray);
        printlnChessArray(sparseArray);
        System.out.println("恢复原始数组:");
        int[][] chessArr = sparseToChess(sparseArray);
        printlnChessArray(chessArr);
    }

    
    public static int[][] chessToSparse(int[][] chessArray) {
        // 1. 遍历数组得到有效个数
        int sum = 0;
        for (int[] ints : chessArray) {
            for (int chess : ints) {
                if (chess != 0) {
                    sum++;
                }
            }
        }

        // 2. 创建稀疏数组
        // 有一行为二维数组的 行 列 值 所以 + 1
        int[][] sparseArray = new int[sum + 1][3];
        // 3. 将二维数组有效数据存入到稀疏数组 (从第二行开始)
        // 二维数组的行
        int chessRow = chessArray.length;
        // 二维数组的列
        int chessCol = 0;
        // 当前是第几个非0的数
        int count = 0;
        for (int i = 0; i < chessArray.length; i++) {
            int[] rows = chessArray[i];
            if (chessCol == 0) {
                chessCol = rows.length;
            }
            for (int j = 0; j < rows.length; j++) {
                int chess = rows[j];
                if (chess != 0) {
                    count++;
                    sparseArray[count][0] = i;
                    sparseArray[count][1] = j;
                    sparseArray[count][2] = chess;
                }
            }
        }
        // 4. 补全第一行 (行 列 值)
        sparseArray[0][0] = chessRow;
        sparseArray[0][1] = chessCol;
        sparseArray[0][2] = sum;

        // 5. 返回稀疏数组
        return sparseArray;
    }

    
    public static int[][] sparseToChess(int[][] sparseArray){
        // 1. 创建原始二维数组
        int[][] chessArray = new int[sparseArray[0][0]][sparseArray[0][1]];
        // 2. 恢复数据
        // 从1开始,读取第二行
        for (int i = 1; i < sparseArray.length; i++) {
            int[] rows = sparseArray[i];
            chessArray[rows[0]][rows[1]] = rows[2];
        }
        // 3. 返回原始数组
        return chessArray;
    }

    
    public static void printlnChessArray(int[][] chessArray){
        for (int[] ints : chessArray) {
            for (int anInt : ints) {
                System.out.printf("%-2dt", anInt);
            }
            System.out.println();
        }
    }
}

至此,稀疏数组就学完了,小伙伴们一定要多动手多思考哦!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/937700.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号