稀疏数组-数据结构-压缩算法
概述:
当一个数组中大部份元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。
处理方式:
记录数组一共有几行几列,有多少不同值
把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序规模
public class main { //棋盘方式 public static void main(String []args) { //创建一个二维数组11*11,规定:0:没有棋子,1:黑棋,2:白棋 int [][]arr=new int [11][11];//创建一个行11列11的数组 arr[1][2]=1; arr[2][3]=2; System.out.println("输出原始数组"); for(int[] ip:arr){//因为打印的是二维数组所以要有两次的for循环 for(int a:ip){ System.out.print(a+"\t"); } System.out.println(); } //转换为稀疏数组保存:怎么样遍历有效值 创建一个稀疏数组保存方式 //获取有效值的个数 int sum=0; for(int i=0;i<11;i++){ for(int j=0;j<11;j++){ if(arr[i][j]!=0){ sum++; } } } System.out.println("有效值个数:"+sum); //2.创建一个稀疏数组 int [][]arr2=new int [sum+1][3];//根据有效个数+1就是他的行数(因为计算有效个数的时候,标题列,他是不会计算的所以他要+1,把标题行算进去),固定列为3列,因为无论有多少个数,我们都只需要行、列、值,这三个数据就可以了 //打印稀疏数组的头部,图可以看上面的,坐标0就是头部 arr2[0][0]=11;//存了多少行 arr2[0][1]=11;//存了多少列 arr2[0][2]=sum;//存了多少个有效值 //遍历二维数组,将非0的值,存放稀疏数组中 int count=0;//总共有多少个数,这个数值可以当做行 for(int i=0;i<arr.length;i++){//原来的数组 for(int j=0;j<arr[i].length;j++){//arr[i].length:arr数组中,每个i的值的length是多少 if(arr[i][j]!=0){//遍历数组后,获取数组值,然后判断,如果获取到的值不等于0,那我们就把值存到稀疏数组中 count++;//计算不相同的数 arr2[count][0]=i;//count的第一个数出来后,他们里面的第0个值,就存放横坐标 arr2[count][1]=j;//他们里面的第1个值,就存放纵坐标 arr2[count][2]=arr[i][j];//他们里面的第2个值,就存放他的值 } } } //输出稀疏数组 System.out.println("输出稀疏数组"); for(int i=0;i<arr2.length;i++){ System.out.print(arr2[i][0]+"\t"+arr2[i][1]+"\t"+arr2[i][2]+"\t");//因为他只有0,1,2列 System.out.println("第"+arr2[i][0]+"列"+"\t"+"第"+arr2[i][1]+"行"+"\t"+"值:"+arr2[i][2]+"\t");//因为他只有0,1,2列 } System.out.println("还原稀疏数组"); //1.读取稀疏数组的值 int [][]arr3=new int [arr2[0][0]][arr2[0][1]];//[arr2[0][0]]:行,[arr2[0][1]]列 //2.给其中的元素还原值 for(int i=1;i<arr2.length;i++){ //把arr2的值放在新数组里 arr3[arr2[i][0]][arr2[i][1]]=arr2[i][2];//通过行列的坐标把arr2对应的值赋值给arr3,arr3通过arr2[i][0]坐标 arr2[i][1]坐标,获取到arr2[i][0] arr2[i][1]元素的值 } //3.打印还原后的数组 System.out.println("输出原始数组"); for(int[] ip:arr3){//因为打印的是二维数组所以要有两次的for循环 for(int a:ip){ System.out.print(a+"\t"); } System.out.println(); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能