稀疏数组
在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵。
1、思路分析
实际运用:五子棋
蓝色棋子以2表示;黑色棋子以1表示。可将其转换成二维数组:
由于0占位太多,也没有具体的意义,可对该数组进行压缩。
压缩后的数组,第一行存储的是原数组有几行几列有几个有效值。从索引为1开始,记录每个元素在原数组的索引位置,以及值。
2、代码实现
代码演示:
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class SparseArray {
public static void main(String[] args) throws IOException {
// ~~~~~ 以五子棋为例,定义一个数组,该棋盘9*9,有2个棋子
int chessArray[][] = new int[9][9];
chessArray[1][3] = 2;
chessArray[2][2] = 1;
// 输出打印,看一下该原始数组
System.out.println("原始数组:");
for (int[] ints : chessArray) {
for (int item : ints) {
System.out.print(item+"\t");
}
System.out.println();
}
// 1,将原始数组转为稀疏数组,遍历原始数组,并将有效值存入到list集合中
List<Integer> list = new ArrayList<>();
int sum = 0;
for (int i = 0; i < chessArray.length; i++) {
for (int j = 0; j < chessArray[i].length; j++) {
if(chessArray[i][j] != 0){
sum++;
list.add(i);
list.add(j);
list.add(chessArray[i][j]);
}
}
}
// 创建稀疏数组
int sparseArray[][] = new int[sum+1][3];
sparseArray[0][0] = chessArray.length;
sparseArray[0][1] = chessArray[0].length;
sparseArray[0][2] = sum;
int row = 1;
for (int i = 0; i < list.size() ; i+=3) {
sparseArray[row][0] = list.get(i);
sparseArray[row][1] = list.get(i+1);
sparseArray[row][2] = list.get(i+2);
row++;
}
// 遍历稀疏数组
System.out.println("稀疏数组:");
for (int[] ints : sparseArray) {
System.out.println(ints[0]+"\t"+ints[1]+"\t"+ints[2]);
}
// 2,稀疏数组转为原始数组,恢复到原数组
int chessArray2[][] = new int[sparseArray[0][0]][sparseArray[0][1]];
for (int i = 1; i < sparseArray.length; i++) {
chessArray2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
System.out.println("恢复到原始数组:");
for (int[] ints : chessArray2) {
for (int item : ints) {
System.out.print(item+"\t");
}
System.out.println();
}
}
}
打印结果:
原始数组:
0 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0
0 0 1 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
稀疏数组:
9 9 2
1 3 2
2 2 1
恢复到原始数组:
0 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0
0 0 1 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