介绍稀疏数组之前,问大家一个问题:
如果让你去做一个五子棋程序你会怎么做呢?
我猜大部分人都是将棋盘转化为一个二维数组。我也是这么想的。那么在实现棋盘之后还要实现一个存储当前棋盘的功能呢?
有些人就觉得:“那还不简单,直接存了不就完事了。”没错,是直接存了就完事了,但是还有更精彩的方法,这个方法就是稀疏数组。
稀疏数组介绍:
所谓稀疏数组,顾名思义,就是稀疏的数组。上述存储功能中,二维数组存在大量冗余无效的数据(因为没下棋子的地方数据肯定都是一样的),一起存起来浪费存储空间。所以用到了稀疏数组。
稀疏数组将无效数据全部剔除,只留下有效数据。
话不多说。举例为先:
此为二维数组:
此为稀疏数组:
由以上可知,二维数组数据量为6X7=42,而稀疏数组数据量为3X9=27。
所以稀疏数组的重要性就体现出来了。
稀疏数组的第一行为二维数组的行列数和有效数据量。后面全部为有效数据及其对应的行列值。
好了,让我们来实战一下:
请编写一个代码,自定义二维数组,然后输出这个二维数组转换后的稀疏数组,然后再将稀疏数组转化为二维数组输出(一定要动手动脑试一试,不要直接看答案)。
不多说,直接上代码
package 练习;
import java.util.Scanner;
public class 稀疏数组 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建一个自定义的棋盘二维数组
int a[][] = new int[11][11];
Scanner scan = new Scanner(System.in);
System.out.println("请输入棋盘有效棋子:输入格式为: t row col value");
String torf = "t";
while(torf.equals("t")) {
torf = scan.next();
if(!torf.equals("t")) break;
int row = scan.nextInt();
int col = scan.nextInt();
int value = scan.nextInt();
a[row-1][col-1] = value;
}
int sum = 0,val[]= new int[121],index=0;
int row[] = new int[11],col[] = new int[11];
System.out.println("二维数组为:");
for(int i=0;i<a.length;i++) {
System.out.println();
for(int j=0;j<a[i].length;j++) {
System.out.print(a[i][j]+" ");
//放在一起可以让下面稀疏数组创建时不用循环嵌套,降低时间复杂度。
if(a[i][j]!=0) {
sum++;
val[index]=a[i][j];
row[index]=i+1;
col[index]=i+1;
index++;
}
}
}
//稀疏数组
int sparseArr[][] = new int[sum+1][3];
sparseArr[0][0] = a.length;
sparseArr[0][1] = a[0].length;
sparseArr[0][2] = sum;
for(int i=1;i<sum+1;i++) {
sparseArr[i][0]=row[i-1];
sparseArr[i][1]=col[i-1];
sparseArr[i][2]=val[i-1];
}
System.out.println();
System.out.println("稀疏数组为:");
// for(int i=0;i<sum;i++) {
// System.out.println();
// for(int j=0;j<3;j++) {
// System.out.print(sparseArr[i][j]+" ");
// }
// }
for(int s[]:sparseArr) {
for(int data:s) {
System.out.print(data+" ");
}
System.out.println();
}
//如此,稀疏数组已经存好了有效数据且去除了冗余无效数据
//下面再将稀疏数组转化为二维数组
//转化笨方法1
// int b[][] = new int[11][11];
// for(int i=1;i<sum+1;i++) {
// for(int j=0;j<b.length;j++) {
// if(j+1==sparseArr[i][0]) {
// for(int k=0;k<b[i].length;k++) {
// if(k+1==sparseArr[i][1]) {
// b[j][k]=sparseArr[i][2];
// }
// }
// }
// }
// }
//转化好方法2
int b[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
for(int i=1;i<sparseArr.length;i++) {
b[sparseArr[i][0]-1][sparseArr[i][1]-1] = sparseArr[i][2];
}
System.out.println();
System.out.println("二维数组为:");
for(int i=0;i<b.length;i++) {
System.out.println();
for(int j=0;j<b[i].length;j++) {
System.out.print(b[i][j]+" ");
}
}
scan.close();
}
}