java 稀疏数组

线性结构和非线性结构

线性结构

1>线性结构最为常用的数据结构,其特点是数据元素之间存在一对一的线性关系
2>线性结构有两种不同的存储结构,即顺序存储结构(顺序存储的线性表又称为顺序表,顺序表中存储的数据是线连续的(地址),比如数组、队列、链表、栈等)和链式存储结构(地址不连续,那么可以很好的利用内存碎片)。
3>链式存储的线性表称为链表、链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息
4>顺序与链式的区别:顺序存储地址是连续的、链式存储地址是不连续的

非线性结构

1>非线性结构包含:二维数组、多维数组,广义表,树结构,图结构等
2>树结构和图结构比较常用

稀疏数组

需求:五子棋的存盘退出 与 续上盘的功能

如何保存落子信息 与 如何描述棋盘呢???

答案:是可以用二维数组来表示棋盘 用0、1、2等给数组赋值来表示用户下的白子(2)、黑子(1)、空(0)

找个特点,由于默认值为0,如果直接对二维数组进行全部的读取与存储,那么就会浪费大量的存储空间,并且存了很多没有意义且重复的值:0,那么我们可以用稀疏数组进行数据的压缩

稀疏数组的介绍:

当一个数组中大部分元素是0或者为同一个值的数组时,可以用稀疏数组来保存该数组。
大白话就是:用稀疏数组来描述一个多维数组

稀疏数组的处理方法:

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

源程序:

 0123456
0000220015
1011000170
2000-6000
300000390
491000000
500280000

==第一行和第一列为行数和列数 ==
划分后:

 值(一共有几个特殊的值)
0678
10322
20615
31111
4157
523-6
63539
74091
85228

ps:
1.第一列记录了还原后的数组有几行几列有几个特殊值(非0值,与相同值不同的值)
2.之后便是对特殊值的坐标做记录
3.从6 * 7 变成了 3 * 9

代码的实现:

public class XiShuShuZu {
    public static void main(String[] args) {
        //创造一个 11 * 11 的二维数组
        int array[][] = new int[11][11];
        //0 表示空子 1 表示黑子 2表示蓝子
        array[3][5] = 2;
        array[4][1] = 1;
        array[2][0] = 2;
        array[9][8] = 2;
        array[3][7] = 1;
        //显示一下 原始的二维数组
        System.out.println("原始二维数组");
        for(int []i : array){
            for(int j:i){
                System.out.print(" "+j);
            }
            System.out.println();
        }

        //下一步骤开始创建稀疏数组:
        /**
         * 1.遍历二维数组初始化稀疏数组的行列与值:因为一开始并不知道你有几个值,
         * 根据稀疏数组的特点可以是3列,行 = 值+1
         */
        int col=3,value=0;
        for(int []i : array){
            for(int j:i) {
                if (j != 0) {
                    value++;
                }
            }
        }
        //创建稀疏数组
        int arrayXiShu[][] = new int[value+1][col];
        //描述源数组的基本性质:行、列、几个不同的值
        arrayXiShu[0][0] = 11;
        arrayXiShu[0][1] = 11;
        arrayXiShu[0][2] = value;

        //赋值稀疏数组,行是在变化的,所以单独将行罗列出来
        int count = 1;
        for(int i=0;i<array.length;i++){
            for(int j=0;j<array.length;j++){
                if (array[i][j]!=0){
                    arrayXiShu[count][0] = i; //第一列
                    arrayXiShu[count][1] = j; //第二列
                    arrayXiShu[count][2] = array[i][j]; //第三列
                    count++;
                }
            }
        }

        System.out.println("压缩后的值:");
        for(int i[]:arrayXiShu){
            for (int j: i){
                System.out.print("   "+j);
            }
            System.out.println();
        }

        //复原稀疏数组
        int [][]arrayFuYuan = new int[arrayXiShu[0][0]][arrayXiShu[0][1]];
        for (int i=1;i<arrayXiShu[0][2]+1;i++){
            arrayFuYuan[arrayXiShu[i][0]][arrayXiShu[i][1]] = arrayXiShu[i][2];
        }

        System.out.println("输出遍历后的值");
        for(int []i : arrayFuYuan){
            for(int j:i){
                System.out.print(" "+j);
            }
            System.out.println();
        }
    }
}

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

--------尚硅谷有感

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值