五子棋:
0 0 0 0
1 0 0 0
0 2 1 0
1:黑子
2:黑子
0:空白 占大部分,可利用稀疏数组压缩
稀疏数组的处理方法:
1)记录数组一共有几行几列,有多少个不同的值
2)把具有不同元素的行列记录在一个小规模的数组 中,从而缩小程序的规模(稀疏数组)。
0 0 2 0 1
0 3 0 6 0
0 0 0 0 4
9 0 0 0 0
a[0]保存行数和列数和非零个数
a[0] | 4 | 5 | 6 |
a[1] | 0 | 2 | 2 |
a[2] | 0 | 4 | 1 |
a[3] | 1 | 1 | 3 |
a[4] | 1 | 3 | 6 |
a[5] | 2 | 4 | 4 |
a[6] | 3 | 0 | 9 |
7个三元数组,7*3=21
2*20=40
代码:
package Arayy;
public class SparseArray {
public static void main(String[] args) {
//初始化稀疏数组
int chessArr[][] = new int[11][11];
chessArr[1][2] = 1;
chessArr[2][4] = 2;
for(int i=0; i< chessArr.length; i++){
for(int j=0; j<chessArr[i].length; j++){
System.out.print(chessArr[i][j]+"\t");
}
System.out.println();
}
//转换为稀疏数组1)统计非零个数:
int sum = 0;
for (int i=0; i<11; i++){
for(int j=0; j<11; j++){
if(chessArr[i][j] != 0){
sum++;
}
}
}
//创建稀疏数组
int sparseArray[][] = new int[sum+1][3];
sparseArray[0][0] = 11;
sparseArray[0][1] = 11;
sparseArray[0][2] = sum; //chessArr[0]
//遍历二维数组,将非零的值存入数组sparseArr
int count = 1; //记录这是第几个非零值
for (int i=0; i<11; i++){
for(int j=0; j<11; j++){
if(chessArr[i][j] != 0){
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = chessArr[i][j];
count++;
}
}
}
//输出稀疏数组
for (int i=0; i<sparseArray.length; i++){
System.out.print(sparseArray[i][0]+"\t" + sparseArray[i][1]+"\t" +
sparseArray[i][2]);
System.out.println();
}
//将稀疏数组恢复成二维数组:
//1)先根据第一行创建二维原始数组
//2)后面几行恢复数值
int chessArr2[][] = new int[sparseArray[0][0]][sparseArray[0][1]];
for (int i=1; i<sparseArray.length; i++){
chessArr2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
for (int i=0; i<chessArr2.length; i++){
for(int j=0; j<chessArr2[i].length; j++){
System.out.print(chessArr2[i][j]+" ");
}
System.out.println();
}
}
}
数组存到文件中
课后习题:1)在前面的基础上,将稀疏数组保存到磁盘上,比如map.data。(2)恢复原来的数组时,读取map.data进行恢复