DataStructure_SparseArray

稀疏数组

基本介绍

当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组
稀疏数组的处理方式是:

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

二维数组:

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

稀疏数组:

COLROWVALUE
[0]总行总列有效数据
[1]111
[2]222

应用实例

  1. 使用稀疏数组,来保存二维数组
  2. 把稀疏数组存储,并且可以重新恢复原来的二维数组
  3. 整体思路:
    二维数组↔稀疏数组↔文件
  二维数组转稀疏数组的思路
> 1. 遍历原始的二维数组,得到有效数据的个数sum
> 2. 根据sum就可以创建稀疏数组sparseArr int[sum+1][3]
> 3. 将二维数组的有效数据存入到稀疏数组
 
  稀疏数组转原始的二维数组的思路
> 1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
> 2. 在读取稀疏数组后几行的数据,并赋给原始的二维数组即可

代码实现

/**
 * @author huangqh
 * @create 2020/11/16 17:48
 * @Notes 稀疏数组->1.原数组中存储大量无效数据 占用大量存储空间2.稀疏数组可以避免资源占用,提高I/O效率
 */
public class SparseArr {
    public static void main(String[] args) throws IOException {
        /**
         * <p>
         *  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
         *  0 0 0 0 0 0 0 0 0 0 0
         * </p>
         */
        //创建原始二维数组11*11,0为无效数据
        int[][] initialArray =new  int[11][11];
        initialArray[1][1]=1;
        initialArray[2][2]=2;

        SparseArr.ergodic(initialArray);
        /**
         * <p>
         *  11  11   2
         *  1   1    1
         *  2   2    2
         * </p>
         */
        //sum 获取全部非0数据个数
        int sum = 0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (initialArray[i][j]!=0){
                    sum++;
                }
            }
        }
        //创建稀疏数组
        int[][] sparseArr= new int[sum+1][3];
        sparseArr[0][0] = 11;
        sparseArr[0][1] = 11;
        sparseArr[0][2] = sum;
        //count当前第几个非0数据
        int count=0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (initialArray[i][j]!=0){
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = initialArray[i][j];
                }
            }
        }
        SparseArr.ergodic(sparseArr);
        SparseArr.sparse2txt(sparseArr);
        int[][] arr = SparseArr.txt2sparse();
        //将稀疏数组转为二维数组
//        int[][] arr = new int[sparseArr[0][0]][sparseArr[0][1]];
        for (int i = 1; i <= count; i++) {
        arr[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
        }
        SparseArr.ergodic(arr);
    }

    /**
     * 遍历数组并打印到控制台
     * @param initialArray
     */
    private static void ergodic(int[][] initialArray) {
        for (int[] ints : initialArray) {
            for (int anInt : ints) {
                System.out.printf("%d\t", anInt);
            }
            System.out.println();
        }
    }

    /**
     * 稀疏数组持久化到磁盘
     * @param arr
     * @throws IOException
     */
    private static void sparse2txt(int[][] arr) throws IOException {
        File file = new File("sparse.txt");
        if (!file.exists()) {
            file.createNewFile();
        }
        FileWriter writer = new FileWriter(file);
        for(int i =0; i < arr.length; i++) {
            if (i==arr.length-1){
                writer.append(arr[i][0]+","+arr[i][1]+","+arr[i][2]);
            }else {
                writer.append(arr[i][0]+","+arr[i][1]+","+arr[i][2]+",");
            }
        }
        writer.flush();
    }

    /**
     * 磁盘读取文件,转为稀疏数组
     * @return
     * @throws IOException
     */
    private static int[][] txt2sparse() throws IOException {
    File file = new File("sparse.txt");
    FileInputStream fis = new FileInputStream(file);
    InputStreamReader reader = new InputStreamReader(fis, "UTF-8");
    StringBuffer sb = new StringBuffer();
    while (reader.ready()){
        sb.append((char) reader.read());
    }
    System.out.println(sb.toString());
    reader.close();// 关闭读取流
    fis.close();// 关闭输入流,释放系统资源
    String[] str = sb.toString().split(",");
    int[][] sparseArrHf = new int[str.length / 3][3];
    // 给稀疏数组赋值
    int i = 0;
    for (String s : str) {
        sparseArrHf[(i - (i % 3)) / 3][i % 3] = Integer.parseInt(s);
        i++;
    }
    return sparseArrHf;
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值