java实现稀疏数组

一、概念简介

稀疏数组

就是数组中有很多的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  1  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  0  0  0  0 
 0  0  0  0  0  0  0  0  0  0  0

稀疏数组

 11  11  2 
 2  3  1 
 3  4  2 

可以看出原数组是11*11的,而非零元素只有两个1,2,稀疏数组第一行的数字分别表示原数组的行(11),原数组的列(11),原数组的非零个数(2)之后的每一行都是来存储非零元素的下标和值,例如(2,3,1)表示原数组的1存放在下标为(2,3)的位置。
好的,在了解规律之后就可以进行转换了。首先需要遍历数组找出非零元素的个数,然后建立一个二维数组进行保存,这个新建立的二维数组的行就是原来的非零元素个数sum+1(因为第0行需要保存数组的相关信息,eg 行 列 非零元个数)。遍历数组找到非零元时将数组的位置和信息保存下来即可。这就是原数组转化为稀疏数组表示;同理先初始化一个数组,初始元素全为0,然后直接遍历稀疏数组的每一行,逆向转换即可。

二、代码实现

 public static void main(String []args)
        {
        	int [][]a=new int[11][11];
        	a[2][3]=1;
        	a[3][4]=2;
        	int nonzero=0;  //统计非零元素个数
        	for(int i=0;i<11;i++)
        	{
        		for(int j=0;j<11;j++)
        		{
        		   if(a[i][j]!=0)
        		   {
        			   nonzero++;
        		   }
        		   //System.out.print(a[i][j]);
        		}
        	   // System.out.print("\n");
        	}
        	//将矩阵转化为稀疏矩阵,稀疏矩阵只有3列分别保存行,列,值
        	int [][]sparse=new int[nonzero+1][3];
        	sparse[0][0]=sparse[0][1]=11;
        	sparse[0][2]=nonzero;
        	int count=1;     //,第一行是矩阵信息,从第二行开始进行转换
        	for(int i=0;i<11;i++)
        	{
        		for(int j=0;j<11;j++)
        		{
        			if(a[i][j]!=0)
        			{
        				sparse[count][0]=i;
        				sparse[count][1]=j;
        				sparse[count][2]=a[i][j];
        				count++;
        			}
        		}
        	}
        	for(int i=0;i<nonzero+1;i++)
        	{
        		for(int j=0;j<3;j++)
        			System.out.print(" "+sparse[i][j]+" ");
        		System.out.print("\n");
        	}
        	//将稀疏矩阵转换为原来的矩阵
        	int [][]b=new int[sparse[0][0]][sparse[0][1]];
        	count=sparse[0][2];
        	for(int k=1;k<=count;k++)
        	{
        		int i=sparse[k][0];
        		int j=sparse[k][1];
        		b[i][j]=sparse[k][2];
        	}
        	for(int i=0;i<sparse[0][0];i++)
        	{
        		for(int j=0;j<sparse[0][1];j++)
        			System.out.print(" "+b[i][j]+" ");
        		System.out.print("\n");
        	}	
        }

运行结果展示

 11  11  2 
 2  3  1 
 3  4  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  1  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  0  0  0  0 
 0  0  0  0  0  0  0  0  0  0  0 

学习自B站java数据结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值