数据结构笔记

数据机构笔记

数组

定义:
是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式。这些有序排列的同类数据元素的集合称为数组。
特点

1、里面的所有的数据的类型必须要保持一致性(例如:int[6] 表示该数组里面的数据为整形的)
2、在计算机里面的储存空间也是连续的。数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起。
3、数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。例如,a[0]表示名字为a的数组中的第一个元素,a[1]代表数组a的第二个元素,以此类推。


注意 :
1、在特点里面总结的它在计算机里面的存贮为连续的空间,那么有二维数组和三维数组,它们的空间地址应该怎么算呢?将其进行降维度进行想就好了。
2、在数组的下标都是从0开始取的。

稀疏数组

产生背景:在二维数组学习的时候,大家会发现有时候出现很多毫无意义且冗余的数据,列如:(在五子棋游戏的开发中的时候,我们记录棋盘的数据;在地图坐标中标注地点的时候总有很多没有意义的数据)

实际的例子:用一个二维数组来记录上一局的棋子的位置,肯定是想到用二维数组来记录比较方便,接下来我用一般人的思维来处理看看:(首先我们规定0表示是没有棋子,1表示黑子,2表示黑子,试着来记录一盘15*15规格的棋盘)

棋盘的位置如图。
在这里插入图片描述

那么简单粗暴的方式来记录这张表就应该是

0 0 0 0 0 0 0 0 0 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 0 2 1 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 0 0 1 1 1 2 0 0 0 0 0 0 0

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

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

0 0 0 0 0 2 2 0 0 0 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

发现了什么吗?

首先就是我们的二维数组里面的有效数据就是21个,而无效数据0占据了很多的空间,并且如果存盘,那么当数据量大的时候对IO流的操作是否就降低了性能了。

所以就引入了我们现在的主题了,稀疏数组来处理。

那么接下来看看稀疏数组的处理方式吧。

稀疏数组的处理思路

1、数组的列数总是确定的为三列,分别是对应原数组的行、列、值

2、数组的第一行记录的是原数组的列、行、和有效的值个数

3、从第二行起开始记录所处位置的行和列分别对应什么值
咱们通过稀疏数组来记录上面的数组的长相就是 注意:数组的下标都是从0开始计数的。

row column value

0(第一行) 15 15 21

1(第二行) 1 7 1

2(第三行) 2 5 2

3(第四行) 2 6 1

…(一共二十多个,我就不一 一对应了)

那么想象一下,这样一来我们的数据是不是就进行了压缩了?原来需要15 * 15=175个数据,转化为稀疏数组后只需要21 * 3=36个数据来存储。

说了那么多的,也要上代码来实现一下相对应的转换,这个才是实际的,那么好,接下来我们来进行

Java代码的实现

开始之前还是要讲一讲思路吧,直接上图
图片1001

具体核心的代码实现:

public static int[][] arrayToSparseArray(int[][] array){//转化为稀疏数组
    //统计得到有效数据数据
    int sum=0;
    for (int [] row:array) {
        for (int item : row) {
            if (item !=  0) {
                sum++;
            }
        }
    }
    int[][] sparseArray=new int[sum+1][3];//定义好稀疏数组
    System.out.println("--------原数组:-----------");
    for (int [] row:array) {
        for (int item : row) {
            System.out.print("\t" + item);
        }
        System.out.println();
    }
    /**
       * @author TQY 杨显伍
       * @date 2022/9/29 15:33
       *  effect: 初始化第一行
      */
    sparseArray[0][0]=array.length;
    sparseArray[0][1]=array[0].length;
    sparseArray[0][2]=sum;

    /**
       * @author TQY 杨显伍
       * @date 2022/9/29 15:33
       *  effect: 真正核心的代码
      */
    int sRow=1;//插入到稀疏数组时确定行数。
    for (int row=0;row< array.length;row++){
        for (int coul=0;coul<array[row].length;coul++){
            if (array[row][coul]!=0){
                sparseArray[sRow][0]=row;
                sparseArray[sRow][1]=coul;
                sparseArray[sRow][2]=array[row][coul];
                sRow++;
            }
        }
    }
    return sparseArray;
}
public static int[][] sparseArrayToArray(int[][] sparseArray){//稀疏数组转化为数组

    int [][] array=new int[sparseArray[0][1]][sparseArray[0][1]];//初始化数组
    /**
       * @author TQY 杨显伍
       * @date 2022/9/29 15:50
       *  effect: 核心代码
      */
    for (int row=1;row<sparseArray.length;row++){

        for (int clou=0;clou<sparseArray[row].length;clou++){

            array[sparseArray[row][0]][sparseArray[row][1]]=sparseArray[row][2];
        }
    }
    return array;
}

代码运行结果图
代码运行截图

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TTQYXW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值