稀疏数组

什么叫稀疏数组?
如果二维数组中的大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
相比与 二维数组而言,稀疏数组存放的数据更少,如果通过稀疏数组的方式存入信息,会占用更小的磁盘空间
而且,就如五子棋而言,我们只需要存棋子的信息,没有棋子的位置都是一个值,那么我们何必将这些默认值也存到磁盘中呢?

稀疏数组一般有 n行3列
稀疏数组的第一行会存放
二维数组的行,二维数组的列,二维数组的有效值
其余行数存放
有效值的行,有效值的列,有效值

image.png

二维数组转稀疏数组

  1. 遍历原始的二维数组,获取有有效值的个数sum
  2. 然后形成 int[sum+1][3] 的稀疏数组
  3. 二维数组的有效数据存入到 稀疏数组

稀疏数组还原成二维数组

  1. 稀疏数组转 二维数组
  2. 读取稀疏数组的第一行,然后创建二维数组
  3. 读取稀疏数组后几行的数据,然后赋给原始数组

代码实现

  1. public class SparseArray {
  2. public static void main(String[] args) {
  3. //创建一个原始的二维数组 用来表示五指棋的棋盘
  4. //0 表示没有棋子 1 表示黑子 2 表示白子
  5. int[][] chessArr1 = new int[11][11];
  6. chessArr1[1][2] = 1;
  7. chessArr1[2][3] = 2;
  8. chessArr1[4][5] = 2;
  9. System.out.println("原始二维数组:");
  10. for (int[] row : chessArr1) {
  11. for (int col : row) {
  12. System.out.printf("%d\t",col);
  13. }
  14. System.out.println();
  15. }
  16. /*
  17. 二维数组转 稀疏数组
  18. 遍历原始的二维数组,获取有有效值的个数sum
  19. 然后形成 int[sum+1][3] 的稀疏数组
  20. 二维数组的有效数据存入到 稀疏数组
  21. */
  22. int sum = 0;
  23. for (int i = 0; i < 11; i++) {
  24. for(int j = 0; j < 11; j++) {
  25. if (chessArr1[i][j] != 0) {
  26. sum++;
  27. }
  28. }
  29. }
  30. System.out.println("有效值一共有"+ sum +"个");
  31. //创建对应的 稀疏数组并初始化
  32. int[][] sparseArr = new int[sum+1][3];
  33. //第一列存放有 多少行,多少列,多少个有效值
  34. sparseArr[0][0] = 11;
  35. sparseArr[0][1] = 11;
  36. sparseArr[0][2] = sum;
  37. //然后将有效值的信息存入到其他行
  38. //比如第一个有效值是1 在 第二行的第三列,那么就设置成 1 2 1
  39. int row = 1;//记录第几个有效值
  40. for (int i = 0; i < 11; i++) {
  41. for(int j = 0; j < 11; j++) {
  42. if (row > sum) {
  43. break;
  44. }
  45. if (chessArr1[i][j] != 0) {
  46. sparseArr[row][0] = i;
  47. sparseArr[row][1] = j;
  48. sparseArr[row][2] = chessArr1[i][j];
  49. row++;
  50. }
  51. }
  52. }
  53. System.out.println();
  54. System.out.println("压缩后的稀疏数组:");
  55. //输出稀疏数组
  56. for (int i = 0; i < sparseArr.length; i++) {
  57. System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
  58. }
  59. /*
  60. 稀疏数组转 二维数组
  61. 读取稀疏数组的第一行,然后创建二维数组
  62. 读取稀疏数组后几行的数据,然后赋给原始数组
  63. */
  64. int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
  65. for (int i = 1; i <= sparseArr[0][2]; i++) {
  66. chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
  67. }
  68. System.out.println("还原后的二维数组:");
  69. for (int[] r : chessArr2) {
  70. for (int col : r) {
  71. System.out.printf("%d\t",col);
  72. }
  73. System.out.println();
  74. }
  75. }
  76. }