数据结构(一) - 稀疏数组

稀疏数组

定义:

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

如 : 五子棋,每个位置的默认值为0,当棋手在落子的时候会改变棋盘数据.当我们需要对棋盘进行存盘时.我们不需要把所有的位置数据都记录到硬盘中.只需要把落子的数据存盘就可以.这样存盘可以节省一定量的内存空间.稀疏数组就是专门做这件事情的.

处理方法 :

1 : 记录数组一共有几行几列.有多少个不同的值

2 : 把存有不同值的元素的行列及值记录在一个小规模的数组中.从而缩小程序的规模.

思路 :

原本的二维数据中我们一个有6行7列.共42个值.当我们用稀疏数组去存储这个数组的值时.
如右图,第一行用来记录该数据一共有多少个值.其中非0的有几个(如图为8),
后面每一组记录每个坐标的位置与值.
这样我们就把原先需要存储42个值的内存压缩到了27个.这样节省了内存

在这里插入图片描述

处理过程:

1 : 遍历原始的二维数组.得到有效数据的个数.sum;

2 : 根据sum就可以创建稀疏数组sparseArr int[sum+1][3];

3 : 将二维数组的有效数据存入到稀疏数组中;

Demo

package com.xbb.demo;

import org.junit.Test;

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

    /**
     * 棋盘
     *  b : 表示黑子;
     *  w : 表示白子;
     *  n : 表示Null;
     */
    @Test
    public void test(){
        String [][] qipan = new String[10][11];
        qipan[3][2] = "B";
        qipan[3][9] = "W";
        qipan[4][2] = "B";
        qipan[6][2] = "W";
        // 用来记录一共有几个值
        int valueCount = 0;
        // 遍历棋盘
        System.out.println("--------------------------------");
        System.out.println("----------原始棋盘----------");
        System.out.println("--------------------------------");
        for (String[] data : qipan) {
            for(String str : data){
                if(str != null) valueCount++;
                System.out.print((str == null ? "n":str) + " ") ;
            }
            System.out.println();
        }
        // 稀疏数组,用来存储具体的值
        String [][] sparseArr = new String[valueCount+1][3];
        sparseArr[0][0] = qipan.length+"";
        sparseArr[0][1] = qipan[0].length+"";
        sparseArr[0][2] = valueCount+"";
        int count = 1;
        // 给稀疏数组赋值
        for (int i=0;i<qipan.length;i++) {
            for(int j=0;j<qipan[i].length;j++){
                if(qipan[i][j] != null){
                    sparseArr[count][0] = i+"";
                    sparseArr[count][1] = j+"";
                    sparseArr[count][2] = qipan[i][j];
                    count++;
                }
            }
        }
        System.out.println("--------------------------------");
        System.out.println("----------稀疏数组----------");
        System.out.println("--------------------------------");
        // 遍历稀疏数组
        for (String[] data : sparseArr) {
            for (String str :data) {
                System.out.print(str + " ");
            }
            System.out.println();
        }
        // 复盘棋盘
        System.out.println("--------------------------------");
        System.out.println("----------复盘棋盘----------");
        System.out.println("--------------------------------");
        String[][] resetQiPan = new String[Integer.parseInt(sparseArr[0][0])][Integer.parseInt(sparseArr[0][1])];
        for (int i=1;i<= Integer.parseInt(sparseArr[0][2]);i++){
            resetQiPan[Integer.parseInt(sparseArr[i][0])][Integer.parseInt(sparseArr[i][1])] = sparseArr[i][2];
        }
        for (String[] data : resetQiPan) {
            for(String str : data){
                if(str != null) valueCount++;
                System.out.print((str == null ? "n":str) + " ") ;
            }
            System.out.println();
        }
    }
}

**运行效果图 : **

从下图中可以看出.当我们需要对原始数据进行存储的时候.可以通过稀疏数组对原始数据进行有效的压缩.这样当我们在存入本地数据库或磁盘中的时候就可以节省很大的空间.

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值