• Java实现稀疏数组


    1、概念

    如果一个数组(包括多维数组)中的大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组,节约空间。

    一般来说,稀疏数组的处理方法是:

    1.记录数组一共有几行几列,有多少个不同的数值。
    2.把具有不同值的元素的行列记录在一个小规模的数组中,从而缩小程序的规模。
    如图所示,一般来说,第一行存取几行几列以及几个不同的数值。

    2、应用

    1、可以使用稀疏数组来保留类似前面的二维数组(棋盘,地图等)。
    2、把稀疏数组存盘,并且可以重新恢复原来的二维数组数。

    3、Java代码实现

    (1)、原始数组转换为稀疏数组 

     1 /***
     2      * 将原始数组转换为稀疏数组
     3      * @param arr
     4      * @return
     5      */
     6     private static int[][] arr2SparseArray(int[][] arr){
     7         int length_hang = arr.length,legtn_lie = arr[0].length,sum = 0;
     8         //计算非零元素个数
     9         for (int i = 0; i < length_hang; i++) {
    10             for (int j = 0; j < legtn_lie; j++) {
    11                 if (0!= arr[i][j]){
    12                     sum++;
    13                 }
    14             }
    15         }
    16         int[][]sparseArray = new int[sum+1][3];
    17         //第一行分别代表原始数组的行数、列数和非零元素个数
    18         sparseArray[0][0] = length_hang;
    19         sparseArray[0][1] = legtn_lie;
    20         sparseArray[0][2] = sum;
    21         //遍历原始数组,记录非零元素的坐标和值
    22         int inex = 1;
    23         for (int i = 0; i < arr.length; i++) {
    24             for (int j = 0; j < arr[i].length; j++) {
    25                 if (0!= arr[i][j]){
    26                     sparseArray[inex][0] = i;
    27                     sparseArray[inex][1] = j;
    28                     sparseArray[inex][2] = arr[i][j];
    29                     inex++;
    30                 }
    31             }
    32         }
    33         return sparseArray;
    34     }
    View Code

    (2)、稀疏数组恢复为原始数组

     1 /**
     2      * 稀疏数组恢复原始数组
     3      * @param sparseArray
     4      * @return
     5      */
     6     private static int[][] sparseArray2Arr(int[][]sparseArray){
     7         //读取原始数组的行和列(稀疏数组第一行)
     8         int length_hang = sparseArray[0][0],length_lie = sparseArray[0][1];
     9         int[][] arr = new int[length_hang][length_lie];
    10         //从第二行开始遍历稀疏数组,恢复非零元素
    11         for (int i = 1; i < sparseArray.length; i++) {
    12                 arr[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
    13         }
    14         return arr;
    15     }
    View Code

    4、测试

     1 public static void main(String[] args) {
     2         int[][] arr = new int[6][7];
     3         arr[0][3] = 22;
     4         arr[0][6] = 15;
     5         arr[1][1] = 11;
     6         arr[1][5] = 17;
     7         arr[2][3] = -6;
     8         arr[3][5] = 39;
     9         arr[4][0] = 91;
    10         arr[5][2] = 28;
    11         
    12         System.out.println("=================原始数组===================");
    13         for (int[] ints : arr) {
    14             for (int a : ints) {
    15                 System.out.print(a+"	");
    16             }
    17             System.out.println();
    18         }
    19         System.out.println("==================变换为稀疏数组============");
    20         int[][]sparseArray = arr2SparseArray(arr);
    21         for (int[] ints : sparseArray) {
    22             for (int a : ints) {
    23                 System.out.print(a+"	");
    24             }
    25             System.out.println();
    26         }
    27         System.out.println("==================恢复为原始数组============");
    28         int[][] arr1 = sparseArray2Arr(sparseArray);
    29         for (int[] ints : arr1) {
    30             for (int a : ints) {
    31                 System.out.print(a+"	");
    32             }
    33             System.out.println();
    34         }
    35     }
    View Code

    5、结果

     1 =================原始数组===================
     2 0    0    0    22    0    0    15    
     3 0    11    0    0    0    17    0    
     4 0    0    0    -6    0    0    0    
     5 0    0    0    0    0    39    0    
     6 91    0    0    0    0    0    0    
     7 0    0    28    0    0    0    0    
     8 ==================变换为稀疏数组============
     9 6    7    8    
    10 0    3    22    
    11 0    6    15    
    12 1    1    11    
    13 1    5    17    
    14 2    3    -6    
    15 3    5    39    
    16 4    0    91    
    17 5    2    28    
    18 ==================恢复为原始数组============
    19 0    0    0    22    0    0    15    
    20 0    11    0    0    0    17    0    
    21 0    0    0    -6    0    0    0    
    22 0    0    0    0    0    39    0    
    23 91    0    0    0    0    0    0    
    24 0    0    28    0    0    0    0    
    25 
    26 Process finished with exit code 0
    View Code
  • 相关阅读:
    12-Factor与云原生Part2
    Openshift部署流程介绍
    软件开发过程中的环境简介
    基于Openshift的SpringBoot微服务
    日志审计系统设计
    dotnetcore执行shell脚本
    12-Factor与云原生
    项目管理思考小记之一
    DevOps工程师的成长路线图
    消费者驱动的契约Consumer drivern Contract
  • 原文地址:https://www.cnblogs.com/cq-yangzhou/p/12888504.html
Copyright © 2020-2023  润新知