稀疏数组的实现

本文介绍了稀疏数组的概念及其在处理大量零值或相同值数组时的优势。通过举例一个11x11的二维数组,展示如何将其转换为3x3的稀疏数组以节省空间。同时,提供了将二维数组转换为稀疏数组及反之的Java实现方法,用于在棋盘游戏和地图等场景中保存和恢复状态。
摘要由CSDN通过智能技术生成
package sparsearray;

/*
*
* 现在有一数组arr
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   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   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   0   0   0   0   0   0   0   0
* 稀疏数组
* 应用场景:棋盘(退出的时候暂时保存棋盘的当前状态),地图等
* 概念:当一个数组大部分元素为0,或者同一个值的数组时,可以使用稀疏数组来保存该数组。
* 处理方法:
* 1)记录数组一共有几行几列,有多少个不同的值
* 2) 把存储元素的行、列、值存储在一个小规模的数组中,从而缩小程序规模
* 转换为稀疏数组sparseArr后
* 行  列 值
* 11 11 2
* 1  2  1
* 2  3  2
* sparseArr[0][1] sparseArr[0][1]  sparseArr[0][2]分别存储原二维数组的行、列、有值元素个数 
* 这样只需要3*3的二维数组就存储了原来11*11的二维数组存储的内容,大大节省了空间
* 
*
*
*
* */
public class SparseArray {

    //初始化一个数组
   public static int[][] initArr(){
        int arr[][] = new int[11][11];
        for (int i = 0; i<11;i++){
            for (int j = 0; j<11;j++){
                arr[i][j] = 0;
            }
        }
        arr[1][2] = 1;
        arr[2][3] = 2;
        return arr;
   }

    public static void main(String[] args) {

        int arr[][] = initArr();
        int sparseArr[][] = toSparseArray(arr);
        printArr(sparseArr);
        int arr1[][] = toArr(sparseArr);
        printArr(arr1);

    }
    //二维数组转换为稀疏数组
    /*
    * 1.得到元素的数目num
    * 2.初始化一个数组sparseArr[num+1][3]
    * 3.遍历二维数组,把不为0的元素的行,列,值赋值给sparseArr[curPos]
    *
    * */
    public static int[][] toSparseArray(int arr[][]){
        int m = arr.length;
        int n = arr[0].length;
        int num = 0;
        for (int i=0;i<arr.length;i++){
            for (int j =0;j<arr[i].length;j++){
                if (arr[i][j]!=0){
                    num++;
                }
                System.out.print(arr[i][j]+"   ");
            }
            System.out.println();
        }
        int sparseArr[][] = new int[num+1][3];
        int curPos = 0;
        sparseArr[curPos++] = new int[]{m,n,num};
        for (int i=0;i<arr.length;i++){
            for (int j =0;j<arr[i].length;j++){
                if (arr[i][j]!=0){
                    sparseArr[curPos++]=new int[]{i,j,arr[i][j]};
                }
            }

        }
        return sparseArr;
    }

    /*
    * 打印二维数组
    * */
    public static void printArr(int arr[][]){
        for (int i=0;i<arr.length;i++){
            for (int j =0;j<arr[i].length;j++){

                System.out.print(arr[i][j]+"   " );
            }
            System.out.println();
        }
    }
    /*
    *
    * 稀疏数组转换为二维数组
    * 1.获取二维数组的行m和列n从稀疏数组的第一行获取sparseArr[0]
    * 2.初始化二维数组arr[m][n]
    * 3.遍历稀疏数组,给二维数组赋值
    *
    * */
    public static int[][] toArr(int sparseArr[][]){

        int m =sparseArr[0][0];
        int n = sparseArr[0][1];
        int [][]arr = new int[m][n];
        for (int i= 1;i<sparseArr.length;i++){
            //System.out.println(sparseArr[i][0] + " " + sparseArr[i][1] +" " +sparseArr[i][2]);
            arr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }
        return arr;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值