前言
数据结构之稀疏数组,是数组的其中一种,可以减少空间的分配
提示:以下是本篇文章正文内容,下面案例可供参考
一、应用场景
-
编写的五子棋程序中,有存盘和续上盘的功能。
分析问题
因为该二维数组的很多值的默认值为0,因此也记录了很多没有意义的数据。
二、基本介绍
当一个数组中大部分元素为零或同一值时,可以使用稀疏数组来保存该数组
三、处理方法
-
记录数组一共有几行几列,有多少个不同的值
-
把具有不同值的元素及值记录在一个小规模的数组中,从而缩小程序的规模
稀疏数组举例说明
四、二维数组 与 稀疏数组 的相互转换
二维数组转稀疏数组的思路
-
遍历原始二维数组,得到有效数据的个数sum
-
根据sum就可以创建稀疏数组 sparseArr int [sum+1] [3(固定)]
-
将二维数组的有效数据存入到稀疏数组中
稀疏数组转二维数组的思路
-
先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组。
-
再读取稀疏数组后几行的数据,并赋给原始的二维数组即可
五、代码实现
/**
* 稀疏数组实现
*/
public class sparseArray {
public static void main(String[] args) {
int[][] originalArray = new int[11][11];
originalArray[1][2]=1;
originalArray[2][4]=2;
originalArray[8][8]=1;
System.out.println("原始数组:");
for (int[] ints : originalArray) {
for (int anInt : ints) {
System.out.printf("%d\t",anInt);
}
System.out.println();
}
//遍历得到有效数据个数存入sum中
int sum = 0;
for (int[] ints : originalArray) {
for (int anInt : ints) {
if(anInt!=0){
sum++;
}
}
}
System.out.println("数组中非零个数sum="+sum);
//创建稀疏数组规格
//根据sum就可以创建稀疏数组 sparseArr int[sum+1][3]
int[][] sparseArray = new int[sum + 1][3];
//第一行第一列存放原数组共有多少行
sparseArray[0][0] = originalArray.length;
//第一行第二列存放原数组共有多少列
sparseArray[0][1] = originalArray[0].length;
//第一行第三列存放原数组共有有效数据的个数(sum)
sparseArray[0][2] = sum;
//将二维数组的有效数据存入到稀疏数组中
//count用于记录是第几个有效数据,也用来存放在第几行中(count是多少,就把有效数据存放在稀疏数组的第几行中)
int count = 0;
for (int i = 0; i < originalArray.length; i++) {//
for (int j = 0; j < originalArray[i].length; j++) {
if (originalArray[i][j]!=0){ //判断该位置的元素不等于0,为有效元素
count++;
sparseArray[count][0] = i; //稀疏数组count行的第1列存放i(元素在原数组的几行)
sparseArray[count][1] = j;//稀疏数组count行的第2列存放j(元素在原数组的几列)
sparseArray[count][2] = originalArray[i][j];稀疏数组count行的第3列存放元素值
}
}
}
System.out.println("稀疏数组:");
for (int i = 0; i < sparseArray.length; i++) {
System.out.printf("%d\t%d\t%d",sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);
System.out.println();
}
//稀疏数组转换成原始数组
System.out.println("新的原始数组:");
//创建原始数组格式
//先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组。
//第一行第一列为原始数组需要的行数,第一行第二列为原始数组需要的列数
int[][] newArray = new int[sparseArray[0][0]][sparseArray[0][1]];
//遍历稀疏数组
for (int i = 1; i < sparseArray.length; i++) {
//再读取稀疏数组后几行的数据,并赋给原始的二维数组即可。
newArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
for (int[] ints : newArray) {
for (int anInt : ints) {
System.out.printf("%d\t",anInt);
}
System.out.println();
}
}
}