java实现稀疏数组

什么是稀疏数组?

用来简化某个二维数组中大量无效数据的一种二维数组

举例:

0 0 0 0 0 0 0 0 0 0
0 0 1 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 3 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或者同一个数值的情况下就可以考虑使用稀疏数组

一般是如下处理:

(1)记录原始二维数组一共几行几列,有多少个不同的值;

(2)把具有不同值的元素的行及列值记录在一个小规模的数组中,从而缩小程序的规模

例如:

0: 10 10  3
1:  1  2  1
2:  2  3  2
3:  4  4  3

其中,第一行记录的信息是原始二维数组的行、列信息以及有效数据的个数,后面依次存储的是有效数据的行、列信息以及所代表的数值。

具体实现方法:

(1)遍历原始的二维数组,得到有效数据的个数sum

(2)根据sum就可以创建稀疏数组sparseArr int[sum+1][3]

(3)将二维数据的有效数据存入到稀疏数组

代码实现:

package com.zcx;

/**
 * @author Kesrn
 * 稀疏数组:用于二维数组中存在多个相同或者为0的数据 
 */
public class ArrayTest {

	public static void main(String[] args) {
		//原始二维数组-》稀疏数组
		//原始数据
		int [][] arr=new int[11][11];
		arr[1][2]=1;
		arr[2][3]=2;
		arr[3][4]=2;
		for (int[] is : arr) {
			for(int num:is) {
				System.out.printf("%d\t",num);
			}
			System.out.println();
		}
		//获取有限数据sum
		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);
		
		//创建对应的稀疏数组
		int sparseArray[][]=new int[sum+1][3];
		
		sparseArray[0][0] =11;
		sparseArray[0][1] =11;
		sparseArray[0][2] =sum;
		
		int count = 0;//记录有效的数据个数
		for (int i =0;i<11;i++) {
			for(int j =0;j<11;j++) {
				if(arr[i][j] != 0) {
					count++;
					sparseArray[count][0] = i;
					sparseArray[count][1] = j;
					sparseArray[count][2] = arr[i][j];
					
				}
			 
			}
		}
		for(int i = 0;i< sparseArray.length;i++) {
			System.out.printf("%d\t%d\t%d\t\n",sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);
		}
		System.out.println();
		
		
		

当然我们存储为稀疏数组之后,也得能从稀疏数组转回原始二维数组:

具体实现:

(1)先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组

(2)在读取稀疏数组除了第一行后几行的数据,并赋给原始二维数组

//原始二维数组《-稀疏数组
		
		int i = sparseArray[0][0];
		int j = sparseArray[0][1];
		int newArr[][] = new int[i][j];
		for(int k = 1;k<sparseArray.length;k++) {
			//sparseArray[k][0]指的原始二维数组的列 sparseArray[k][1]指的原始二维数组的行 sparseArray[k][2]指的原始二维数组对应的值
			newArr[sparseArray[k][0]][sparseArray[k][1]] = sparseArray[k][2];
		}
		System.out.println("===========稀疏转二维============");
		for (int[] is : newArr) {
			for(int num:is) {
				System.out.printf("%d\t",num);
			}
			System.out.println();
		}

 


版权声明:本文为qq_43678588原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。