• 二维数组与稀疏数组转换(java)


    一、什么是稀疏数组

    稀疏数组:是一个数组,他的作用是将二维数据保存的值进行优化,减小储存数据的大小。

    格式:稀疏素组是一个(n+1)*3的二维数组,其中n表示二维数组中有多少个不同的值。稀疏数组,第一行保存,二维数据的行、列、不同的值得个数;剩余行保存不同值的坐标、值;

    举例:

    如下数组为一个11*11的二维数组,有3个位置不是0,所以n为3。此例中保存二维数组需要保存11*11个数字,保存稀疏数组需要4*3个。

     二维数组:

    1. 1 0 0 1 0 0 0 0 0 0 0
    2. 0 1 0 0 0 0 0 0 0 0 0
    3. 0 0 0 0 0 0 0 0 0 0 0
    4. 0 0 0 0 0 0 0 0 0 0 0
    5. 0 0 0 0 0 0 0 0 0 0 0
    6. 0 0 0 0 0 0 0 0 0 0 0
    7. 0 0 0 0 0 0 0 0 0 0 0
    8. 0 0 0 0 0 0 0 0 0 0 0
    9. 0 0 0 0 0 0 0 0 0 0 0
    10. 0 0 0 0 0 0 0 0 0 0 0
    11. 0 0 0 0 0 0 0 0 0 0 0

     稀疏数组:

    1. 11 11 3
    2. 0 0 1
    3. 0 3 1
    4. 1 1 1

     

    适用场景
    当一个数组中大部分元素为0,或者为同一个值得数组时,可以使用稀疏数组来保存该数组;在11*11的场景中,如果不一样的数据超过39个,不适合使用稀疏数组(不考虑数据地址的细节)

    二、二维数据如何转换为稀疏数组

    1. // 二维数组转稀疏数组
    2. private static int[][] array2SparsArray(int[][] array) {
    3. //获取二维数据行和列
    4. int rowLength = array.length;
    5. int colLength = array[0].length;
    6. //获取不一样的数据
    7. int sum = 0;
    8. for (int i = 0; i < rowLength; i++) {
    9. for (int j = 0; j < colLength; j++) {
    10. if (array[i][j] != 0) {
    11. sum++;
    12. }
    13. }
    14. }
    15. //初始化稀疏数组
    16. int[][] sparsArray = new int[sum + 1][3];
    17. //第一行保存二维数组的大小和不一样值得个数
    18. sparsArray[0][0] = rowLength;
    19. sparsArray[0][1] = colLength;
    20. sparsArray[0][2] = sum;
    21. //遍历二维数据,将不同的值的坐标和值保存到稀疏数组
    22. //记录稀疏数组的行
    23. int count = 0;
    24. for (int i = 0; i < rowLength; i++) {
    25. for (int j = 0; j < colLength; j++) {
    26. if (array[i][j] != 0) {
    27. count++;
    28. //保存二维数组的坐标
    29. sparsArray[count][0] = i;
    30. sparsArray[count][1] = j;
    31. //保存二维数组的值
    32. sparsArray[count][2] = array[i][j];
    33. }
    34. }
    35. }
    36. return sparsArray;
    37. }

    三、稀疏数组如何恢复为二维数组

    1. // 稀疏数组转二维数组
    2. private static int[][] sparsArray2Array(int[][] sparsArray) {
    3. //获取二维数据行和列
    4. int rowLength = sparsArray[0][0];
    5. int colLength = sparsArray[0][1];
    6. //初始化二维数组
    7. int[][] array = new int[rowLength][colLength];
    8. int sparsArrayLength = sparsArray.length;
    9. for (int i = 1; i < sparsArrayLength; i++) {
    10. //回复二维数组中不一样的值
    11. array[sparsArray[i][0]][sparsArray[i][1]] = sparsArray[i][2];
    12. }
    13. return array;
    14. }

    四、完整代码并测试

    1. public class sparsearray {
    2. public static void main(String[] args) {
    3. int[][] array1 = new int[11][11];
    4. array1[0][0] = 1;
    5. array1[1][1] = 1;
    6. array1[0][3] = 1;
    7. System.out.println("打印二维数组");
    8. printArray(array1);
    9. int[][] sparsArray = array2SparsArray(array1);
    10. System.out.println("打印二维数组转换后的稀疏数组");
    11. printArray(sparsArray);
    12. System.out.println("打印稀疏数组回复后的二维数据");
    13. int[][] array2 = sparsArray2Array(sparsArray);
    14. printArray(array2);
    15. }
    16. // 二维数组转稀疏数组
    17. private static int[][] array2SparsArray(int[][] array) {
    18. //获取二维数据行和列
    19. int rowLength = array.length;
    20. int colLength = array[0].length;
    21. //获取不一样的数据
    22. int sum = 0;
    23. for (int i = 0; i < rowLength; i++) {
    24. for (int j = 0; j < colLength; j++) {
    25. if (array[i][j] != 0) {
    26. sum++;
    27. }
    28. }
    29. }
    30. //初始化稀疏数组
    31. int[][] sparsArray = new int[sum + 1][3];
    32. //第一行保存二维数组的大小和不一样值得个数
    33. sparsArray[0][0] = rowLength;
    34. sparsArray[0][1] = colLength;
    35. sparsArray[0][2] = sum;
    36. //遍历二维数据,将不同的值的坐标和值保存到稀疏数组
    37. //记录稀疏数组的行
    38. int count = 0;
    39. for (int i = 0; i < rowLength; i++) {
    40. for (int j = 0; j < colLength; j++) {
    41. if (array[i][j] != 0) {
    42. count++;
    43. //保存二维数组的坐标
    44. sparsArray[count][0] = i;
    45. sparsArray[count][1] = j;
    46. //保存二维数组的值
    47. sparsArray[count][2] = array[i][j];
    48. }
    49. }
    50. }
    51. return sparsArray;
    52. }
    53. // 稀疏数组转二维数组
    54. private static int[][] sparsArray2Array(int[][] sparsArray) {
    55. //获取二维数据行和列
    56. int rowLength = sparsArray[0][0];
    57. int colLength = sparsArray[0][1];
    58. //初始化二维数组
    59. int[][] array = new int[rowLength][colLength];
    60. int sparsArrayLength = sparsArray.length;
    61. for (int i = 1; i < sparsArrayLength; i++) {
    62. //回复二维数组中不一样的值
    63. array[sparsArray[i][0]][sparsArray[i][1]] = sparsArray[i][2];
    64. }
    65. return array;
    66. }
    67. // 二维数组打印
    68. private static void printArray(int[][] array) {
    69. int rowLength = array.length;
    70. int colLength = array[0].length;
    71. for (int i = 0; i < rowLength; i++) {
    72. for (int j = 0; j < colLength; j++) {
    73. System.out.printf("%d\t", array[i][j]);
    74. }
    75. System.out.println();
    76. }
    77. }
    78. // 稀疏数组存盘
    79. // 读取稀疏数组
    80. }
    1. 打印二维数组
    2. 1 0 0 1 0 0 0 0 0 0 0
    3. 0 1 0 0 0 0 0 0 0 0 0
    4. 0 0 0 0 0 0 0 0 0 0 0
    5. 0 0 0 0 0 0 0 0 0 0 0
    6. 0 0 0 0 0 0 0 0 0 0 0
    7. 0 0 0 0 0 0 0 0 0 0 0
    8. 0 0 0 0 0 0 0 0 0 0 0
    9. 0 0 0 0 0 0 0 0 0 0 0
    10. 0 0 0 0 0 0 0 0 0 0 0
    11. 0 0 0 0 0 0 0 0 0 0 0
    12. 0 0 0 0 0 0 0 0 0 0 0
    13. 打印二维数组转换后的稀疏数组
    14. 11 11 3
    15. 0 0 1
    16. 0 3 1
    17. 1 1 1
    18. 打印稀疏数组回复后的二维数据
    19. 1 0 0 1 0 0 0 0 0 0 0
    20. 0 1 0 0 0 0 0 0 0 0 0
    21. 0 0 0 0 0 0 0 0 0 0 0
    22. 0 0 0 0 0 0 0 0 0 0 0
    23. 0 0 0 0 0 0 0 0 0 0 0
    24. 0 0 0 0 0 0 0 0 0 0 0
    25. 0 0 0 0 0 0 0 0 0 0 0
    26. 0 0 0 0 0 0 0 0 0 0 0
    27. 0 0 0 0 0 0 0 0 0 0 0
    28. 0 0 0 0 0 0 0 0 0 0 0
    29. 0 0 0 0 0 0 0 0 0 0 0

  • 相关阅读:
    (Linux学习一):Mac安装vmWare11.5,centOS 7安装步骤教程
    【C语言必知必会| 第十篇】指针入门,这一篇就够了
    MyBatis 关于查询语句上配置的详细内容
    springboot微服务前端传参数至后端的几个方式,@RequestBody如何传入多个参数
    MQ - 24 Pulsar集群架构设计与实现
    掌动智能:卓越性能的API接口测试工具
    Application Studio 学习笔记(2)
    在windows服务器上部署一个单机项目以及前后端分离项目
    4.MySQL数据库的备份与还原,内容很多耐心看完,会有收获O!!!
    集成学习思想
  • 原文地址:https://blog.csdn.net/qq_29752857/article/details/126377573