当前位置: 首页 > 后端技术 > Java

稀疏数组与数组的关系及转换

时间:2023-04-01 23:29:06 Java

算法基础(一):稀疏数组与数组的关系及转换在csdn上很久了,发现有些文章对逻辑关系不太重视写的时候和友善,有的在看视频,有的是从书里随便挑的,让人看的云里雾里;为了给后面来的同学铺垫,也为了给自己一个深度思考的空间,我准备开始写算法。这个系列从稀疏数组开始,会不断更新,直到我觉得算法到了一个好的地步。我会停止更新。希望这个过程可以帮助更多的人在算法的道路上越走越远。因为我喜欢边写文章边听歌学习,所以我会在每篇文章的最后分享一首歌给大家。稀疏数组的应用背景:如果在一个数组中,某个元素A出现的总次数远大于其他元素出现次数的总和,那么这个数组就可以存储在一个稀疏数组中。例如:这是一个西洋双陆棋棋盘(15*15)。如果用普通的二维数组存储,无论从空间还是效率上都不是很友好,而且存储起来很麻烦。以一个简单的数组为例,只存储了两个棋子:int[][]array=newint[15][15];数组[1][3]=1;数组[2][4]=2;for(int[]row:array){for(intitem:row){System.out.printf("%d\t",item);//注意是printf}System.out.println();}代码效果:那么如何用更好的方法来存储里面的信息呢?稀疏数组的实现显然是我们在这种场景下需要使用数组来存储数据,那么我们不妨在设计数组的时候指定另外一种存储规则来实现高效的实现。规则如下:遍历原始二维数组,得到有效数据的个数count。根据求和,可以创建一个稀疏数组sparseArrint[count+1,3]。//count+1的原因是因为稀疏数组第一行存储的是low列和,第二行存储的是实际数据,所以需要+1来存储二维数组的有效数据进入稀疏数组。二维数组转稀疏数组的方法如下:publicstaticint[][]castSparseArray(int[][]arr){introw=arr.length;//获取行数intcloumn=arr[0].length;//获取列数intsum=0;//黑白子数计数器for(inti=0;i读取稀疏数组中的第一行数据(存放二维数组的基本信息行列和有效值)到初始化二维数组2->根据稀疏数组后面的行(第二行)的数据,将值一一赋值回原二维数组即可。例如:第一条规则的实现:intarry2[][]=newint[sparseArr[0][0]][sparseArr[0][1]];第二条规则的实现:for(inti=1;i