稀疏数组的定义、如何压缩、如何还原
-
定义
以五子棋的存盘退出和续上盘功能为例,黑棋为1,白棋为2,空格为0,因为零所代表的空格很多,
所以储存很多零意义不大,所以推出一种压缩算法,抹掉零(同值元素),即稀疏数组。 -
稀疏素组的处理方式
- 记录数组共有几行几列,有多少个不同值
- 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序规模
public class SparseArray { public static void main(String[] args) { // 1.创建一个二维数组11*11 0:没有棋子 1:代表黑棋 2:代表白棋 int[][] arrays = new int[11][11]; arrays[1][2] = 1; arrays[2][3] = 2; // 2.转换为稀疏数组保存 // 2.1 获取有效值的个数 int sum = 0; for (int i = 0; i < arrays.length; i++) { for (int j = 0; j < arrays[i].length; j++) { if (arrays[i][j] != 0){ sum++; } } } // 2.2 创建一个稀疏数组 // 稀疏数组的3列是固定的,sum+1是因为第一行是概述 int[][] arrays2 = new int[sum+1][3]; arrays2[0][0] = arrays.length; arrays2[0][1] = arrays[0].length; arrays2[0][2] = sum; // 2.3 遍历二维数组,将非零的值,存放在稀疏数组中 int count = 0; for (int i = 0; i < arrays.length; i++) { for (int j = 0; j < arrays[i].length; j++) { if (arrays[i][j]!=0){ count++; arrays2[count][0] = i; arrays2[count][1] = j; arrays2[count][2] = arrays[i][j]; } } } // 3.输出稀疏数组 for (int i = 0; i < arrays2.length; i++) { for (int j = 0; j < arrays2[i].length; j++) { System.out.print(arrays2[i][j]+"\t"); } System.out.println(); } System.out.println("========================="); // 4.还原稀疏数组 int[][] arrays3 = new int[arrays2[0][0]][arrays2[0][1]]; for (int i = 1; i < arrays2.length; i++) { //把稀疏数组中的列与行的数据对应到新建的数组中,注意;i应该从1开始 arrays3[arrays2[i][0]][arrays2[i][1]] = arrays2[i][2]; } for (int i = 0; i < arrays3.length; i++) { for (int j = 0; j < arrays3[i].length; j++) { System.out.print(arrays3[i][j]+"\t"); } } } }