稀疏数组和二维数组的转换

稀疏数组的定义

在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵。定义非零元素的总数比上矩阵所有元素的总数为矩阵的稠密度。


稀疏数组的意义

普通的二维数组,若是数值为0的元素数目过多,且二维数组过大,在存储至磁盘时的效率低于稀疏数组的存储效率


稀疏数组的格式

二维数组的行数 二维数组的列数 二维数组的有效值的个数
有效值的行数(下标从0开始) 有效值的列数 有效值

应用场景

在这里插入图片描述

问题1

将上图中的五子棋转为稀疏数组(0代表无子,1代表黑子,2代表蓝子)

思路

1:创建一个二维数组(行,列,黑子,蓝子)
2:length()方法获取二维数组的行数,列数
3:遍历二维数组,获取非0值的个数
4:创建稀疏数组,并赋值第一行
5:遍历二维数组,将非0数值的对应行,列,值赋值给稀疏数组


问题2

稀疏数组转为二维数组

思路

1:获取稀疏数组的第一行的数据(行,列,有效值个数)来创建二维数组
2:遍历稀疏数组将每一行的数据赋予二维数组的对应位置


代码实现

public class SparseArray {
    
    
    public static void main(String[] args) {
    
    
        //创建一个原始的二维数组 11*11
        //0表示没有棋子,1表示黑子,2表示蓝子
        int chessArray [][] = new int[11][11];
        // 棋盘上赋予棋子
        chessArray[1][2] = 1;
        chessArray[2][3] = 2;
        //输出原始的二维数组
        System.out.println("原始的二维数组");

        for (int[] ints : chessArray) {
    
    
            for (int item : ints) {
    
    
                System.out.print(item+"       ");
            }
            System.out.println();
        }

        //将二维数组转为稀疏数组
        // 1:先遍历二维数组,先得到非0数据的个数
        // 记录非0数据的个数sum
        int sum = 0;
        for (int[] ints : chessArray) {
    
    
            for (int item : ints) {
    
    
                if(item != 0){
    
    
                    sum++;
                }
            }
        }
        // 2:创建对应的一个稀疏数组
        int sparseArray[][] = new int[sum+1][3];
        // 给稀疏数组的第一行赋值
        // 获取原始二维数组的行数和列数
        sparseArray[0][0] = chessArray.length;
        sparseArray[0][1] = chessArray[0].length;
        sparseArray[0][2] = sum;

        //  把二维数组的非0数据赋予稀疏数组
        //  遍历二维数组,将非0数据赋值给稀疏数组
        //  count用来计数在稀疏数组中非0数据的行数
        int count = 1;
        for(int i = 0;i<chessArray.length;i++){
    
    
            for(int j = 0;j<chessArray[0].length;j++){
    
    
                if(chessArray[i][j] != 0){
    
    
                    sparseArray[count][0] = i;
                    sparseArray[count][1] = j;
                    sparseArray[count][2] = chessArray[i][j];
                    count++;
                }
            }
        }
        //  输出稀疏数组
        System.out.println("转换后的稀疏数组");
        for (int[] ints : sparseArray) {
    
    
            for (int i : ints) {
    
    
                System.out.print(i+"   ");
            }
            System.out.println();
        }

        // 将稀疏数组转为二维数组
        //1: 读取稀疏数组的第一行来创建二维数组
        int chessArray2[][] = new int[sparseArray[0][0]][sparseArray[0][1]];

        // 从稀疏数组里获取值赋予二维数组
        for(int i = 1;i<sparseArray.length;i++){
    
    
            chessArray2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
        }

        //输出二维数组
        System.out.println("稀疏数组转二维数组");
        for (int[] ints : chessArray2) {
    
    
            for (int i : ints) {
    
    
                System.out.print(i+"       ");
            }
            System.out.println();
        }

    }
}

Guess you like

Origin blog.csdn.net/weixin_45690465/article/details/120185451