• 稀疏数组


    1. 先看一个实际的需求

    编写的五子棋程序中,有存盘退出和续上盘的功能

    2. 分析问题:

    因为该二维数组的很多值是默认值0, 因此记录了很多没有意义的数据.->稀疏数组

    3. 基本介绍

    当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。

    稀疏数组的处理方法是:

    • 记录数组一共有几行几列,有多少个不同的值
    • 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模

    4. 应用实例

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

    5. 整体思路分析

    二维数组 转 稀疏数组的思路

    1. 遍历 原始的二维数组,得到有效数据的个数 sum
    2. 根据sum 就可以创建 稀疏数组 sparseArr int[sum + 1] [3]
    3. 将二维数组的有效数据数据存入到 稀疏数组

    稀疏数组转原始的二维数组的思路

    1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的 chessArr2 = int [11][11]

    2. 在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可.

    6. 代码实现

    package com.atguigu.sparsearray;
    
    /**
     * @author john
     * @date 2019/12/14 - 17:10
     */
    public class SparseArray {
        public static void main(String[] args) {
            // 创建一个原始的二维数组  11*11
            // 0: 表示没有棋子, 1: 黑子,2: 白子
            int chessArr1[][] = new int[11][11];
            chessArr1[1][2] = 1;
            chessArr1[2][3] = 2;
            chessArr1[4][5] = 2;
    
            //输出 原始的二维数组--及需要保存的棋盘
            System.out.println("原始的二维数组~~");
            for (int[] row : chessArr1) {
                for (int data : row) {
                    System.out.printf("%d	", data);
                }
                System.out.println();
            }
    
            System.out.println("----------------------------------------");
    
            //将二维数组 转 稀疏数组的思路
            // 1. 先遍历二维数组 得到非0数据的个数
            int sum = 0;
            for (int i = 0; i < 11; i++) {
                for (int j = 0; j < 11; j++) {
                    if (chessArr1[i][j] != 0) {
                        sum++;
                    }
                }
            }
    
            // 2. 创建对应的稀疏数组
            // 稀疏数组除了保存非零数的索引位置值,还有原始数组的长度信息
            int sparseArr[][] = new int[sum + 1][3];
            // 给稀疏数组赋值--保存原始数组长度以及非零数总数信息
            sparseArr[0][0] = 11;
            sparseArr[0][1] = 11;
            sparseArr[0][2] = sum;
            //遍历二维数组,将非零的值存放到sparseArr中
            int count = 0; //用于记录当前是第几个非零数据
            for (int i = 0; i < 11; i++) {
                for (int j = 0; j < 11; j++) {
                    if (chessArr1[i][j] != 0) {
                        count++;
                        sparseArr[count][0] = i;
                        sparseArr[count][1] = j;
                        sparseArr[count][2] = chessArr1[i][j];
                    }
                }
            }
    
            //输出稀疏数组的形式
            System.out.println();
            System.out.println("获取到的稀疏数组是~~~~");
            System.out.println("第一行表示信息分别是,数组的两个长度信息,以及原始数据中非零数总数信息");
            for (int i = 0; i < sparseArr.length; i++) {
                System.out.printf("%d	%d	%d	
    ", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
            }
            System.out.println();
    
            //下面  将稀疏数组恢复为原始二维数组
            // 1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的  chessArr2 = int[11][11]
            int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
            // 2. 读取稀疏数组剩余的数据,根据记录的索引位置信息以及值,赋给原始的二维数组 即可
            for (int i = 1; i < sparseArr.length; i++) {
                chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
            }
    
            System.out.println("----------------------------------------");
    
            //输出恢复后的数组
            System.out.println("输出恢复后的数组");
            for (int[] row : chessArr2) {
                for (int data : row) {
                    System.out.printf("%d	", data);
                }
                System.out.println();
            }
        }
    }
    
    

  • 相关阅读:
    jmeter学习笔记(3)-jmeter结合fiddler
    jmeter学习笔记(2)—http信息头管理器+断言
    requests接口自动化9-共享session和传递cookie
    djangorestframework学习1-通过HyperlinkedModelSerializer,ModelViewSet,routers编写第一个接口
    requests接口自动化8-传递数据为xml形式的post请求:data
    requests接口自动化7-Multi/form-data文件上传形式的post请求:files
    requests接口自动化6-Body里json格式数据形式的post请求:json
    requests接口自动化5-表单参数形式的post请求:data
    requests接口自动化4-登录后才能访问的get请求,需共享cookie
    requests接口自动化3-url里带参数的get请求:params
  • 原文地址:https://www.cnblogs.com/ifme/p/12040337.html
Copyright © 2020-2023  润新知