第 3 章 稀疏数组和队列(1)

news2024/11/19 12:42:02

3.1 稀疏 sparsearray 数组

3.1.1先看一个实际的需求

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

在这里插入图片描述

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

3.1.2基本介绍

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

稀疏数组的处理方法是.

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

稀疏数组举例说明
在这里插入图片描述

3.1.3应用实例

  1. 使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)
  2. 把稀疏数组存盘,并且可以从新恢复原来的二维数组数
  3. 整体思路分析
    在这里插入图片描述
  4. 代码

/**
 * 稀疏数组
 */
public class SparseArray {
    /**
     * 二维数组 转 稀疏数组的思路
     * 1. 遍历  原始的二维数组,得到有效数据的个数 sum
     * 2. 根据sum 就可以创建 稀疏数组 sparseArr   int[sum + 1] [3]
     * 3. 将二维数组的有效数据数据存入到 稀疏数组
     * <p>
     * 稀疏数组转原始的二维数组的思路
     * <p>
     * 1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的  chessArr2 = int [11][11]
     * 2. 在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可.
     */

    /**
     * 有效数据的个数
     */
    static int sum = 0;

    public static void main(String[] args) {
        //创建一个原始的二维数组 11*11
        int chessArrSource[][] = new int[11][11];
        //稀疏数组
        int sparseArr[][] = null;
        //转换后的 二维数组
        int chessArrConvert[][] = null;

        //1.默认棋盘
        defaultChessBoard(chessArrSource);

        //2.二维数组 转 稀疏数组
        sparseArr = toSparseArray(chessArrSource, sparseArr);

        //3.稀疏数组 转 二维数组
        toDoubleDimensionalArray(sparseArr, chessArrConvert);
    }

    /**
     * 1.默认棋盘
     *
     * @param chessArrSource
     */
    public static void defaultChessBoard(int chessArrSource[][]) {
        //0:没有棋子,1:黑棋子,2:蓝棋子
        chessArrSource[1][2] = 1;
        chessArrSource[2][3] = 2;

        //输出原始的二维数组
        System.out.println("原始的二维数组:");
        /**
         * 第一维的数组长度是:intArray.length;
         * 第二维的数组长度是:intArray[index].length;
         *  注: index即索引(下标)的意思。
         */
        for (int[] row : chessArrSource) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }
    }

    /**
     * 2.二维数组 转 稀疏数组
     */
    public static int[][] toSparseArray(int chessArrSource[][], int sparseArr[][]) {
        //2.二维数组 转 稀疏数组的思路
        //2.1. 遍历  原始的二维数组,得到有效数据的个数 sum
        for (int[] row : chessArrSource) {
            for (int data : row) {
                if (data != 0) {
                    sum++;
                }
            }
        }

        //2.2. 根据sum 就可以创建 稀疏数组 sparseArr   int[sum + 1] [3]
        sparseArr = new int[sum + 1][3];

        sparseArr[0][0] = chessArrSource.length;//行数
        sparseArr[0][1] = chessArrSource.length;//列数
        sparseArr[0][2] = sum;//有效数据个数

        //2.3. 将二维数组的有效数据数据存入到 稀疏数组
        int count = 0;//count用于记录是第几个非0数据
        for (int i = 1; i < chessArrSource.length; i++) {
            for (int j = 1; j < chessArrSource.length; j++) {
                if (chessArrSource[i][j] != 0) {
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArrSource[i][j];
                }
            }
        }

        //输出稀疏数组的形式
        System.out.println();
        System.out.println("稀疏数组:");
        for (int i = 0; i < sparseArr.length; i++) {
            System.out.printf("%d\t%d\t%d\t\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
        }

        return sparseArr;
    }

    /**
     * 3.稀疏数组 转 二维数组
     */
    public static void toDoubleDimensionalArray(int sparseArr[][], int chessArrConvert[][]) {
        //稀疏数组转原始的二维数组的思路
        //1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的  chessArr2 = int [11][11]
        chessArrConvert = new int[sparseArr[0][0]][sparseArr[0][1]];

        //2. 在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可.
        for (int i = 1; i < sparseArr.length; i++) {
            chessArrConvert[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }

        //输出转换后的二维数组
        System.out.println();
        System.out.println("转换后的二维数组:");
        for (int[] row : chessArrConvert) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }
    }
}

原始的二维数组:
0	0	0	0	0	0	0	0	0	0	0	
0	0	1	0	0	0	0	0	0	0	0	
0	0	0	2	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	

稀疏数组:
11	11	2	
1	2	1	
2	3	2	

转换后的二维数组:
0	0	0	0	0	0	0	0	0	0	0	
0	0	1	0	0	0	0	0	0	0	0	
0	0	0	2	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
  1. 练习要求:
    在前面的基础上,将稀疏数组保存到磁盘上,比如 map.data
    恢复原来的数组时,读取map.data 进行恢复

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/886251.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python进阶之符号计算概述SymPy

一、概述 1.1SymPy简介 SymPy 是一个由 Python 编写的符号计算库&#xff0c;它的目标是成为一个全功能的计算机代数系统&#xff0c;同时保持代码简洁、易于理解和扩展。它完全由 Python 写成&#xff0c;不依赖于外部库。SymPy 支持符号计算、高精度计算、模式匹配、绘图、解…

搭建Excel服务器

1、下载Excel服务器 下载地址 2、解压文件 3、打开服务器 4、服务器运行信息 5、连接测试 打开客户端 6、登录到服务器 默认账号 密码 admin 3 修改文件保存路径(服务器端点击配置) 7、客户端整体界面 8、配置权限 9、设计模板 10、其他用户登录就可以填写信息 11、用户&#…

JVM基础了解

JVM 是java虚拟机。 作用&#xff1a;运行并管理java源码文件锁生成的Class文件&#xff1b;在不同的操作系统上安装不同的JVM&#xff0c;从而实现了跨平台的保证。一般在安装完JDK或者JRE之后&#xff0c;其中就已经内置了JVM&#xff0c;只需要将Class文件交给JVM即可 写好的…

【MCUXpresso for VS Code】-- 工程搭建后期维护

​ 基于上一篇文章【MCUXpresso for VS Code】 – 基于VSCode搭建nxp mcu工程_ 本章将介绍工程搭建完成后&#xff0c;后期维护问题。 1.MCUXpresso 插件窗口 该窗口&#xff0c;通常用在编译调试&#xff0c;工程导入导出等场合。编译和调试除了点击图标外&#xff0c;也可以…

python简单计算器

附赠源码&#xff1a; import PySimpleGUI as sg import relistsNumber [[AC, (, ), %],[1, 2, 3, ],[4, 5, 6, -],[7, 8, 9, x],[0, ., , ], ]layout [[sg.Text(font(黑体, 10), key-msg-)],[sg.Multiline(,key-show-,s(22, 10),font(黑体, 14),border_width1,expand_xTrue…

Java进阶(3)——手动实现ArrayList 源码的初步理解分析 数组插入数据和删除数据的问题

目录 引出手动实现ArrayList定义接口MyList<T>写ArrayList的实现类增加元素删除元素 写测试类进行测试数组插入数据? 总结 引出 1.ArrayList的结构分析&#xff0c;可迭代接口&#xff0c;是List的实现&#xff1b; 2.数组增加元素和删除元素的分析&#xff0c;何时扩容…

Spring三级缓存解决循环依赖问题

一、Bean对象的创建过程 一般的Bean对象如下&#xff1a;首先通过构造器构造一个普通对象&#xff0c;然后进行依赖注入&#xff0c;再进行一些初始化操作&#xff0c;初始化后根据AOP生成代理对象&#xff0c;最后再放入单例池map&#xff0c;这个单例池map就是一级缓存。 …

Data Abstract for .NET and Delphi Crack

Data Abstract for .NET and Delphi Crack .NET和Delphi的数据摘要是一套或RAD工具&#xff0c;用于在.NET、Delphi和Mono中编写多层解决方案。NET和Delphi的数据摘要是一个套件&#xff0c;包括RemObjects.NET和Delphi版本的数据摘要。RemObjects Data Abstract允许您创建访问…

DHCP Server

简介 动态主机配置协议 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09; 是 RFC 1541&#xff08;已被 RFC 2131 取代&#xff09;定义的标准协议&#xff0c;该协议允许服务器向客户端动态分配 IP 地址和配置信息。 使用UDP协…

C++MFC 串口通信 上位机

本节介绍 在工业控制中&#xff0c;工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信。串口通信方便易行&#xff0c;应用广泛。 一般情况下&#xff0c;工控机和各智能仪表通过RS485总线进行通信。RS485的通信方式是半双工的&#xff0c;只能由作为主…

软件测试知识库+1,5款顶级自动化测试工具推荐和使用分析

“工欲善其事必先利其器”&#xff0c;在自动化测试领域&#xff0c;自动化测试工具的核心地位不容置疑的。目前市面上有很多可以支持接口测试的工具&#xff0c;在网上随便一搜就可以出来很多&#xff0c;利用自动化测试工具进行接口测试&#xff0c;可以很好的提高测试效率&a…

Web3创新者之夜,与其他开发者一同畅谈波卡生态

Token2049在即&#xff0c;许多开发者都将在9月中齐聚新加坡&#xff0c;一同讨论区块链生态发展及未来。届时将会有超过1万名与会者&#xff0c;并有超过300个赞助商和项目协助支持本次大会。波卡作为跨链互操作性的龙头生态也将参与至本次盛会之中。 为了让波卡社区的成员、贡…

uniapp微信小程序消息订阅快速上手

一、微信公众平台小程序开通消息订阅并设置模板 这边的模板id和详细内容后续前后端需要使用 二、uniapp前端 需要是一个button触发 js&#xff1a; wx.getSetting({success(res){console.log(res)if(res.authSetting[scope.subscribeMessage]){// 业务逻辑}else{uni.request…

Python+Selenium自动化测试环境搭建步骤(selenium环境搭建)

一、自动化简介 1.自动化测试概念&#xff1a; 是把以人为驱动的测试转化为机器执行的一种过程&#xff0c;它是一种以程序测试程序的过程 2.自动化测试分类&#xff1a; 一般IT上所说的自动化测试是指功能自动化测试&#xff0c;通过编码的方式用一段程序来测试一个软件的功…

Ctfshow web入门 命令执行RCE篇 web29-web77 与 web118-web124 详细题解 持续更新中(预计8.18完成)~

Ctfshow 命令执行 web29 pregmatch是正则匹配函数&#xff0c;匹配是否包含flag&#xff0c;if(!preg_match("/flag/i", $c))&#xff0c;/i忽略大小写 可以利用system来间接执行系统命令 flag采用f*绕过&#xff0c;或者mv fl?g.php 1.txt修改文件名&#xff0c…

初识Visual Basic编辑器并建立一段简单的代码(下)

【分享成果&#xff0c;随喜正能量】时间宝贵&#xff0c;切莫贪睡。学习诸大菩萨的精神&#xff0c;勇猛精进不懈怠&#xff1b;随缘进取不疲厌。单是说不行&#xff0c;要紧的是做。 《VBA之Excel应用》&#xff08;10178983&#xff09;是非常经典的&#xff0c;是我推出的…

【运维】linkis1.3.2添加jdbc引擎(添加mysql、greenplum、starrocks、doris数据源查询)与配合多数据源管理提交任务初探

文章目录 一. 引擎的安装1. 前置工作2. 获取引擎插件3. 上传和加载4. 引擎刷新4.1. 重启刷新4.2. 检查引擎是否刷新成功 二. 测试mysql、starrocks与doris数据库1. 通过shell提交任务2. 通过(IDE)shell进行提交3. 通过接口提交 三. 添加greenplum四. 通过linkis的数据源管理提交…

【java毕业设计】基于SSM+MySql的人才公寓管理系统设计与实现(程序源码)--人才公寓管理系统

基于SSMMySql的人才公寓管理系统设计与实现&#xff08;程序源码毕业论文&#xff09; 大家好&#xff0c;今天给大家介绍基于SSMMySql的人才公寓管理系统设计与实现&#xff0c;本论文只截取部分文章重点&#xff0c;文章末尾附有本毕业设计完整源码及论文的获取方式。更多毕业…

VGG简单学习

VGG简单学习 简单介绍 在AlexNet网络的基础上&#xff0c;为了设计深层神经网络&#xff0c;牛津大学设计了VGG网络,采用块的设计理念&#xff0c;将AlexNet中多个重复的卷积层和池化层组成一个块 论文中&#xff0c;使用3x3卷积核&#xff0c;padding1的卷积层 和带有2x2的汇…

网工内推 | 网络工程师专场,CCNP证书优先,多次晋升机会

01 上海正诺信息科技有限公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、负责公司办公内网内网需求对接、实施和方案的标准化&#xff1b; 2、负责办公网络、机房的网络设备&#xff08;接入层&#xff09;的运维、变更、故障解决&#xff1b; 3、负责公司网…