什么是稀疏数组?
用来简化某个二维数组中大量无效数据的一种二维数组
举例:
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版权协议,转载请附上原文出处链接和本声明。