稀疏数组

稀疏数组

概念

稀疏数组的出现主要是对普通数据的一种压缩式转化,如果普通数据中存在大量相同字符,稀疏数组即可进行转化为内存空间较小的数据,如:

普通数组:

0 0 0 0 0
0 1 0 0 0
0 0 2 0 0
0 0 0 0 0
0 0 0 0 0

该数组中存在大量相同字符 0 ,可将其转化为稀疏数组:

row col value
5   5   2
1   1   1
2   2   2

该数组将上面 5*5 的二维数组,转化为 3 * 3 的二维数组,

该数组:

  • 第一行是记录普通数组对应的总行数、总列数、总共值的个数(不为0的值的个数)

  • 第二行以后,具体记录行下标、列下标、对应的值

  • 行数不确定,列数为3

以上即为 稀疏数组

普通数组与稀疏数组转化

package cn.com;

/**
 *  稀疏数组
 */
public class SparseArray {

    public static void main(String[] args) {
        // 1.获取普通数组
        int[][] normalArray = getNormalArray();
        // 2.输出普通数组到控制台
        print2Console(normalArray);
        // 3.普通数组转化为 稀疏数组
        int[][] sparseArray = convertNormal2Sparse(normalArray);
        // 4. 输出稀疏数组到控制台
        print2Console(sparseArray);
        // 5. 稀疏数组转化为 普通数组
        int[][] newNormalArray = convertSparse2Normal(sparseArray);
        // 6. 输出转化后的普通数组到控制台
        print2Console(newNormalArray);
    }

    // 获取普通数组
    public static int[][] getNormalArray(){
        int[][] normalArray = new int[5][5];
        normalArray[1][1] = 1;
        normalArray[2][2] = 2;
        return normalArray;
    }

    // 输出内容到控制台
    public static void print2Console(int[][] array){
        for (int[] rows : array){
            for(int v : rows){
                System.out.print(v);
            }
            System.out.println();
        }
        System.out.println("-----------------");
    }

    public static int[][] convertNormal2Sparse(int[][] normalArray){
        // 求出总行数、总列数、总值个数
        int sum = 0;
        for(int[] rows : normalArray){
            for(int v : rows){
                if(v != 0){
                    sum ++;
                }
            }
        }
        int[][] sparseArray = new int[sum + 1][3];
        sparseArray[0][0] = normalArray.length;
        sparseArray[0][1] = normalArray[0].length;
        sparseArray[0][2] = sum;
        int index = 0;
        for(int row = 0; row < normalArray.length; row ++){
            for(int col = 0; col < normalArray[row].length; col ++){
                if(normalArray[row][col] != 0){
                    index ++;
                    sparseArray[index][0] = row;
                    sparseArray[index][1] = col;
                    sparseArray[index][2] = normalArray[row][col];
                }
            }
        }
        return sparseArray;
    }

    public static int[][] convertSparse2Normal(int[][] sparseArray){
        int[][] normalArray = new int[sparseArray[0][0]][sparseArray[0][1]];
        for(int row = 1; row < sparseArray.length; row ++){
            normalArray[sparseArray[row][0]][sparseArray[row][1]] = sparseArray[row][2];
        }
        return normalArray;
    }

}


************************ 控制台输出内容 *********************************

00000
01000
00200
00000
00000
-----------------
552
111
222
-----------------
00000
01000
00200
00000
00000
-----------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值