稀疏数组

定义

稀疏数组可以看做是普通数组的压缩,但是这里说的普通数组是值无效数据量远大于有效数据量的数组,如果一个数组(包括多维数组)中的大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组,节约空间。

存储方式

1.稀疏数组第一行记录原数组一共有几行几列,有多少个不同的值。
2.稀疏数组其他行记录原数组中有意义值的行列和值的大小,

image.png

二维数组与稀疏数组的转换

一般来说,稀疏数组的处理方法是:
1.记录数组一共有几行几列,有多少个不同的数值。
2.把具有不同值的元素的行列及记录在一个小规模的数组中,从而缩小程序的规模。

二维数组转稀疏数组的思路:
1、遍历二维数组,得到有效个数sum。
2、根据sum就可以创建稀疏数组sparseArr int[sum+1][3]
3、将二维数组的有效数据存入稀疏数组。

稀疏数组转原始的二维数组思路:
1、先读取稀疏数组的第一行,根据第一行数据,创建原始的二维数组。
2、在读取稀疏数组后几行的数据,并赋给原始的二维数组即可。

  1. public class SparseArray {
  2. public static void main(String[] args) {
  3. // 1、创建一个原始的二维数组 0:表示没有棋子 1:表示黑子 2:表示白子
  4. int[][] chessArr = new int[11][11];
  5. chessArr[1][2] = 1;
  6. chessArr[2][3] = 1;
  7. chessArr[3][3] = 2;
  8. chessArr[3][4] = 2;
  9. System.out.println("原始的二维数组:");
  10. printArr(chessArr);
  11. System.out.println();
  12. // 2、二维数组转成稀疏数组
  13. // (1)获取非0的元素个数
  14. int sum = 0;
  15. for (int i = 0 ; i < chessArr.length ; i++) {
  16. for(int j = 0; j < chessArr[i].length; j++) {
  17. if (chessArr[i][j] != 0) {
  18. sum++;
  19. }
  20. }
  21. }
  22. // (2)创建稀疏数组
  23. int[][] sparseArr = new int[sum+1][3];
  24. // 稀疏数组第一行记录原二维数组的行+列+非0元素个数
  25. sparseArr[0][0] = 11;
  26. sparseArr[0][1] = 11;
  27. sparseArr[0][2] = sum;
  28. // 非0元素分别存入剩余行
  29. int count = 0;
  30. for (int i = 0 ; i < chessArr.length ; i++) {
  31. for(int j = 0; j < chessArr[i].length; j++) {
  32. if (chessArr[i][j] != 0) {
  33. count++;
  34. sparseArr[count][0] = i;
  35. sparseArr[count][1] = j;
  36. sparseArr[count][2] = chessArr[i][j];
  37. }
  38. }
  39. }
  40. System.out.println("二维数组转稀疏数组:");
  41. printArr(sparseArr);
  42. System.out.println();
  43. // 3、稀疏数组还原成二维数组
  44. int[][] oldArr = new int[sparseArr[0][0]][sparseArr[0][1]];
  45. for (int i = 1 ; i < sparseArr.length ; i++) {
  46. oldArr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
  47. }
  48. System.out.println("稀疏数组还原成二维数组:");
  49. printArr(oldArr);
  50. }
  51. /**
  52. * 打印数组
  53. */
  54. public static void printArr(int[][] arr) {
  55. for (int i = 0 ; i < arr.length ; i++) {
  56. for(int j = 0; j < arr[i].length; j++) {
  57. System.out.printf("%d\t", arr[i][j]);
  58. }
  59. System.out.println();
  60. }
  61. }
  62. }