数据结构算法学习(1)-稀疏数组(Java实现)

## 稀疏数组(棋盘类必备)

image

package com.joseph.sparseArray;

public class SparseArray {
    public static void main(String[] args) {
        //创建11*11的棋盘
        //0表示棋子。1表示黑子。2表示白子
        int chessArr1[][] = new int[11][11] ;
        chessArr1[1][2] = 1 ;//第二行第三列是1;
        chessArr1[2][3] = 2 ;//第三行第四列是2;
        chessArr1[3][4] = 3 ;//第四行第五列是3;
        for(int arr[] : chessArr1){
            for(int arrKey:arr) {
                System.out.print(arrKey + "、");
            }
            System.out.println();
        }
        /**
         * 将二维数组变为稀疏数组
         */
        //获取原二维数组非0值个数
        int count = 0 ;
        for(int arr[]:chessArr1){
            for (int e:arr){
                if(e!=0){
                    count++;
                }
            }
        }
        //创建稀疏数组并初始化第一行的值
        int sparseArr[][] = new int[count+1][3];
        int index = 0 ;
        sparseArr[0][0] = chessArr1.length;
        sparseArr[0][1] = chessArr1[0].length;
        sparseArr[0][2] = count;
        //给稀疏数组第二行开始赋值
        for(int i = 0 ; i <chessArr1.length; i++){
            for (int j = 0 ; j <chessArr1[i].length;j++){
                if (chessArr1[i][j]!=0){
                    //第一列是非0值所在的列数
                    sparseArr[index+1][0] = i+1 ;
                     //第二列是非0值所在的行数
                    sparseArr[index+1][1] = j+1 ;
                     //第三列是非0值的值
                    sparseArr[index+1][2] = chessArr1[i][j];
                    index ++ ;
                }
            }
        }
        System.out.println("---------------------------------------");
        //输出稀疏数组
        for(int sArr[]:sparseArr){
            for(int s:sArr){
                System.out.print(s+",");
            }
            System.out.println();
        }
//        System.out.println(chessArr1[0].length);
    }
}
/**
 * @author JosephWang
 * @date 2021/7/24 15:43
 */

这里的行数和列数为了更加清晰。我们加1处理。为了直接知道第几行第几列

而真正的行列数是从0开始。

这样就成功地把二维数组转换为稀疏数组。如果要用这个二维数组。再将它继续转化。原理是利用数组中元素代表着行数列数和具体的值。拿出来可以用上。具体代码如下

//稀疏数组转二维数组
        //还原二维数组初始化
        int row = sparseArr[0][0] ;
        int col = sparseArr[0][1] ;
//        System.out.println(row + "," + col);
        int chessArr2[][] = new int[row][col] ;
        //放入非零的值
        for(int a = 1 ; a<sparseArr.length;a++){
            for(int b = 0 ; b < sparseArr[0].length;b++){
                //拿到行数
                int resultRow = sparseArr[a][b];
                b++;
                //拿到列数
                int resultCol = sparseArr[a][b];
                b++;
                //拿到非零值
                int result = sparseArr[a][b] ;
                //赋值给二维数组
                chessArr2[resultRow][resultCol] = result ;
            }
        }
        //输出二位数组
        for (int reduction[] :chessArr2){
            for(int reductionKey : reduction){
                System.out.print(reductionKey + "、");
            }
            System.out.println();
        }
    }

image

# 我们发现好像行数列数有点问题。是因为上边的稀疏数组为了直观表明原数组的值的行列数。我们加一处理了。但并不影响我们还原成功。实际上大家应用的时候。不要加一。因为数组下标从0开始。计算机可不需要直观的表现。

## 这样我们就完成了稀疏数组的编程

posted @ 2021-07-24 18:53  王宇凡  阅读(50)  评论(0)    收藏  举报