从围棋了解稀疏数组

1、使用场景

当一个数组中大部分元素是0或者为同一个值的数组时,可以使用稀疏数组来保存该数组
比如点阵存在大量重复的数据,我们没必要耗那么大的空间来存储每一个元素,就可以使用稀疏数组来保存这样的点阵数据

2、围棋复盘演示稀疏数组代码

虽然这不是一个很好的例子,但是可以帮助我们理解稀疏数组,主要是因为围棋存在要到最后一子定输赢的时候,此时稀疏数组既要保存坐标信息,还要保存数据信息,反而扩大了程序的规模增大了内存的开销,此处只是为了便于理解,在存在大量重复数据的点阵,比如csv格式文件的传输上,就可以考虑使用稀疏数组来压缩空间传输。

描述:
创建一个20*20大小的围棋棋盘,0表示没子,1表示此处有白子,2表示此处有黑子

package algorithm;

import java.util.Arrays;

public class SparseArrayDemo {
        public static void main(String[] args) {
                //创建一个20*20大小的棋盘
                int[][]  checkerboard = new int[20][20];
                checkerboard[5][6] = 1;
                checkerboard[6][7] = 2;
                //创建稀疏数组
                //first:查找有效值的个数
                int valid_value_num = 0;
                for(int[] arr : checkerboard){
                        for (int i = 0; i < arr.length; i++) {
                                if(arr[i] != 0) valid_value_num+=1;
                        }
                }
                //second:创建稀疏数组,包含有效值个数+1个数组(第一行需要存储棋盘大小信息,边于复盘)
                //大小为3,横坐标,纵坐标值,数据
                int[][] sparseArray = new int[valid_value_num+1][3];
                //棋盘长度
                sparseArray[0][0] = checkerboard.length;
                //棋盘宽度
                sparseArray[0][1] = checkerboard[0].length;
                //存储数据到稀疏数组
                int index = 1;
                for(int i = 0; i < checkerboard.length; i++){
                        for(int j = 0; j < checkerboard[0].length; j++){
                                if(checkerboard[i][j] != 0) {
                                        sparseArray[index][0] = i;
                                        sparseArray[index][1] = j;
                                        sparseArray[index][2] = checkerboard[i][j] ;
                                        index+=1;
                                }
                        }
                }
                //复盘
                int[][] resume_array = new int[sparseArray[0][0]][sparseArray[0][1]];
                for (int i = 1; i < sparseArray.length; i++) {
                        resume_array[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
                }
                //查看复盘数据
                for (int i = 0; i < resume_array.length; i++) {
                        System.out.println(Arrays.toString(resume_array[i]));
                }
        }
}

纯属个人观点哈,欢迎大佬留言批评指正~~~

你可能感兴趣的:(从围棋了解稀疏数组)