数据结构(1)稀疏sparsearray数组

tech2024-10-27  20

最近打算开始开一个数据结构和算法的专题,如果非要问我为什么我只能说我不想一辈子都当一个搬砖的。在这里特别感谢尚硅谷,你要非觉得我打广告就打广告吧。我知道很多人对培训机构有看法,但是不管怎么说人家确实发了很多免费的东西出来,我也从中学到了很多。

稀疏sparsearray数组

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

稀疏数组的处理方法是: 1、记录数组一共有几行几列,有多少个不同的值 2、把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模

稀疏数组举例 首先给定一个6行7列的原始二维数组,然后其中一共有8个值,但是当我们换成 但是当我们换成稀疏数组记录的时候: 可以看到当换成稀疏数组以后它的第0行存储的是这个二维数组究竟有几行几列,其他行存储的是每个元素在二维数组中的位置。可以看到原来的空间是76=42,后来的空间是93=27,还是省去了1/3还要多一点的空间的。

应用场景

在编写五子棋程序的时候,有存盘和续上盘的功能。 现在就有了这个需求,这个二维数组很多东西为0页就是记录了很多的没有意义的数据,这时候我们正好可以用稀疏数组做记录来完成。 首先我们开始一个转换: 将这个二维数组转化为如下稀疏数组:

rowcolval01111211212232

在这里我想各位应该也看到了稀疏数组的优势,原来一个1111=121的二维数组被压缩成了一个33=9的稀疏数组,最关键的是还不存在失真,我想从这里就可以看到数据结构以及算法的重要性,为什么你拿着每个月几千的工资老板还嫌给你发的多,为什么别人一个月好几万老板还不停的给他涨薪水。

思路

二维数组转稀疏数组的思路 1.遍历 原始的二维数组,得到有效的数据的个数sum 2.根据sum就可以创建稀疏数组sparseArr int[sum+1][3](因为行取决于有多少个有效数据,而列是固定的) 3.将二维数组的有效数据存入稀疏数组

稀疏数组转原始的二维数组的思路 1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组。 2.在读取稀疏数组后几行的数据后,赋值给原始的二维数组。

代码

```java package com.structure.sparsearray; /** * @PackgeName: com.structure.sparsearray * @ClassName: SparseArray * @Author: Hercules * Date: 2020/9/4 8:33 * project name: dataStructure * @Version: * @Description: */ public class SparseArray { public static void main(String[] args) { //创建一个原始的二维数组 11*11 //0: 表示没有棋子,1表示黑子 2表示蓝子 int[][] charArr = new int[11][11]; charArr[1][2] = 1; charArr[2][3] = 2; System.out.println("原始的二维数组是:"); for(int [] row:charArr){ for (int data:row){ System.out.printf("%d\t",data); } System.out.println(); } //将二维数组转稀疏数组的思路 //1.先遍历二维数组 得到非0数据的个数 int sum = 0; for(int [] row:charArr){ for (int data:row){ if(data != 0){ sum++; } } } System.out.println("sum="+sum); //创建对应的稀疏数组 int[][] sparseArr = new int[sum+1][3]; //给稀疏数组赋值,第一行的值是数组有几行几列,有几个有效值 sparseArr[0][0] = 11; sparseArr[0][1] = 11; sparseArr[0][2] = sum; //遍历二维数组的值,将非0的值放入sparseArr中 //count用于记录是第几个 int count = 0; for(int i=0;i<11;i++){ for(int j = 0;j<11;j++){ if(charArr[i][j]!=0){ count++; sparseArr[count][0]=i; sparseArr[count][1]=j; sparseArr[count][2]=charArr[i][j]; } } } System.out.println("得到的稀疏数组为:"); for(int[] row:sparseArr){ for (int item:row){ System.out.printf("%d\t",item); } System.out.println(); } //将稀疏数组--》恢复成原始的二维数组 /** * 1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组。 * 2.在读取稀疏数组后几行的数据后,赋值给原始的二维数组。 */ //1.先读取稀疏数组第一行的数据,根据第一行的数据,创建原始的二维数组 int[][] charArrNew = new int[sparseArr[0][0]][sparseArr[0][1]]; //2.在读取稀疏数组后几行的数据(从第二行开始),创建原始的二维数组 for(int i = 1;i<sparseArr.length;i++){ charArrNew[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2]; } System.out.println("恢复后的二维数组"); for(int[] row:charArrNew){ for (int item:row){ System.out.printf("%d\t",item); } System.out.println(); } } }
最新回复(0)