【数据结构(二)】稀疏 sparsearray 数组(1)

文章目录

  • 1. 稀疏数组的应用场景
    • 1.1. 一个实际的需求
    • 1.2. 基本介绍
  • 2. 稀疏数组转换的思路分析
  • 3. 稀疏数组的代码实现
    • 3.1. 二维数组转稀疏数组
    • 3.2. 稀疏数组转二维数组
  • 4. 课后练习


1. 稀疏数组的应用场景

1.1. 一个实际的需求

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

在这里插入图片描述

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

1.2. 基本介绍

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

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

在这里插入图片描述

上图右表中:
    第[0]行表示:数组大小是6×7,共有8个不为0的值;下面每一行都代表不为0的数值所在的行列数,[1]~[8]共有8个。

2. 稀疏数组转换的思路分析

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

2. 整体思路分析

在这里插入图片描述

二维数组稀疏数组的思路

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

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

  1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的 chessArr2 = int [11][11]
  2. 在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可。

3. 稀疏数组的代码实现

3.1. 二维数组转稀疏数组

package sparsearray;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;//可以在后面继续加棋子//输出原始的二维数组for(int[] row : chessArr1){for(int data : row){System.out.printf("%d\t", data);}System.out.println();}//将二维数组 转 稀疏数组//1.先遍历二维数组,得到非0数据的个数System.out.println("数组的长度为:" + chessArr1.length);int sum = 0;for(int i = 0; i < chessArr1.length; i++){for(int j = 0; j < chessArr1.length; j++){if(chessArr1[i][j] != 0){sum ++;}}}System.out.println("sum=" + sum);//2. 创建对应的稀疏数组int sparseArr[][] = new int[sum + 1][3];//给稀疏数组赋值sparseArr[0][0] = 11;sparseArr[0][1] = 11;sparseArr[0][2] = sum;//遍历二维数组,将非0的值存放到sparseArr中int count = 0; //count 用于记录是第几个非0数据for(int i = 0; i < chessArr1.length; i++){for(int j = 0; j < chessArr1.length; j++){if(chessArr1[i][j] != 0){count++;sparseArr[count][0] = i;sparseArr[count][1] = j;sparseArr[count][2] = chessArr1[i][j];}}}//输出稀疏数组的形式System.err.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]);}System.out.println();}
}

运行结果:

在这里插入图片描述


如果在棋盘上继续加子,如在第5行第6列加一个黑子chessArr1[4][5] = 1;

代码:

package sparsearray;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] = 1;//输出原始的二维数组for(int[] row : chessArr1){for(int data : row){System.out.printf("%d\t", data);}System.out.println();}//将二维数组 转 稀疏数组//1.先遍历二维数组,得到非0数据的个数System.out.println("数组的长度为:" + chessArr1.length);int sum = 0;for(int i = 0; i < chessArr1.length; i++){for(int j = 0; j < chessArr1.length; j++){if(chessArr1[i][j] != 0){sum ++;}}}System.out.println("sum=" + sum);//2. 创建对应的稀疏数组int sparseArr[][] = new int[sum + 1][3];//给稀疏数组赋值sparseArr[0][0] = 11;sparseArr[0][1] = 11;sparseArr[0][2] = sum;//遍历二维数组,将非0的值存放到sparseArr中int count = 0; //count 用于记录是第几个非0数据for(int i = 0; i < chessArr1.length; i++){for(int j = 0; j < chessArr1.length; j++){if(chessArr1[i][j] != 0){count++;sparseArr[count][0] = i;sparseArr[count][1] = j;sparseArr[count][2] = chessArr1[i][j];}}}//输出稀疏数组的形式System.err.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]);}System.out.println();}
}

运行结果:

在这里插入图片描述

3.2. 稀疏数组转二维数组

package sparsearray;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] = 1;//输出原始的二维数组for(int[] row : chessArr1){for(int data : row){System.out.printf("%d\t", data);}System.out.println();}//将二维数组 转 稀疏数组//1.先遍历二维数组,得到非0数据的个数System.out.println("数组的长度为:" + chessArr1.length);int sum = 0;for(int i = 0; i < chessArr1.length; i++){for(int j = 0; j < chessArr1.length; j++){if(chessArr1[i][j] != 0){sum ++;}}}System.out.println("sum=" + sum);//2. 创建对应的稀疏数组int sparseArr[][] = new int[sum + 1][3];//给稀疏数组赋值sparseArr[0][0] = 11;sparseArr[0][1] = 11;sparseArr[0][2] = sum;//遍历二维数组,将非0的值存放到sparseArr中int count = 0; //count 用于记录是第几个非0数据for(int i = 0; i < chessArr1.length; i++){for(int j = 0; j < chessArr1.length; j++){if(chessArr1[i][j] != 0){count++;sparseArr[count][0] = i;sparseArr[count][1] = j;sparseArr[count][2] = chessArr1[i][j];}}}//输出稀疏数组的形式System.err.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]);}System.out.println();//将稀疏数组-->恢复成 原始的二维数组/*** 1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的  chessArr2 = int [11][11]* 2. 在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可。*///1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组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.err.println();System.out.println("恢复后的二维数组");for(int[] row : chessArr2){for(int data : row){System.out.printf("%d\t", data);}System.out.println();}}
}

运行结果:

在这里插入图片描述


4. 课后练习

    
要求:
(1)在前面的基础上,将稀疏数组保存到磁盘上,比如 map.data
(2)恢复原来的数组时,读取 map.data 进行恢复

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

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

相关文章

基于nodejs+express+knex+mysql搭建一个后台服务

前言 首先&#xff0c;我们对nodejs、express、knex、mysql进行说明&#xff1a; Node.js&#xff1a;Node.js 是一个开源的、跨平台的 JavaScript 运行时环境。express&#xff1a;Node.js web application framework 基于nodejs的web应用框架Knex&#xff1a;SQL Query Buil…

ES Kibana 安装

ES & Kibana 本文基于Docker安装部署使用 Kibana的版本和ElasticSearch的版本&#xff0c;以及IK分词器的版本一一对应 Kibana 安装 安装Kibana # 创建网络 [rootiZ2zeg7mctvft5renx1qvbZ ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway …

UE5 - ArchvizExplorer - 数字孪生城市模板 -学习笔记

1、学习资料 https://www.unrealengine.com/marketplace/zh-CN/product/archviz-explorer https://karldetroit.com/archviz-explorer-documentation/ 官网下载的是一个简单版&#xff0c;需要下载扩展&#xff0c;并拷贝到项目录下&#xff0c;才有完整版 https://drive.googl…

力扣104. 二叉树的最大深度(java,DFS,BFS解法)

Problem: 104. 二叉树的最大深度 文章目录 思路和解法复杂度Code 思路和解法 DFS 递归处理&#xff0c;退出条件为节点为空&#xff0c;归的过程每次取出当前节点左右子树的最大深度加一 BFS 经典的借助一个队列实现的BFS&#xff0c;用一个变量记录当前的最大层数&#xff0c…

Python集成学习和随机森林算法

大家好&#xff0c;机器学习模型已经成为多个行业决策过程中的重要组成部分&#xff0c;然而在处理嘈杂或多样化的数据集时&#xff0c;它们往往会遇到困难&#xff0c;这就是集成学习&#xff08;Ensemble Learning&#xff09;发挥作用的地方。 本文将揭示集成学习的奥秘&am…

指针详解【C语言】

1第一步&#xff1a; 学生 *pstu; 这里学生是类型*是解地址 pstu是地址容器语法里 学生 学生1&#xff1b;就会开辟内存。 这里【学生1】和 【*pstu】等效那这里【pstu】是带类型的指针容器*pstu是解地址&#xff0c;还原出类型对象。这里【*】只是解地址的操作符【pstu】…

组合式API_模板引用

虽然 Vue 的声明性渲染模型为你抽象了大部分对 DOM 的直接操作&#xff0c;但在某些情况下&#xff0c;我们仍然需要直接访问底层 DOM 元素。要实现这一点&#xff0c;我们可以使用特殊的 ref attribute&#xff0c;组合式API的实现更为简洁 选项式API_模板引用 <template…

交易者最看重什么?anzo Capital这点最重要!

交易者最看重什么&#xff1f;有人会说技术&#xff0c;有人会说交易策略&#xff0c;有人会说盈利&#xff0c;但anzo Capital认为Vishal 最看重的应该是眼睛吧&#xff01; 29岁的Vishal Agraval在9年前因某种原因失去了视力&#xff0c;然而&#xff0c;他的失明并未能阻…

python文件读写练习题--随机出10套试卷

要求就是&#xff1a;10套试卷题目顺序不同&#xff0c;答案顺序不同 import random import os city {河北省:石家庄市,山西省:太原市,辽宁省:沈阳市,吉林省:长春市,黑龙江省:哈尔滨市,江苏省:南京市,浙江省:杭州市,安徽省:合肥市,福建省:福州市,江西省:南昌市}#在当前路径下…

【C语言从入门到放弃 7】内存管理和命令行参数详解

在C语言中&#xff0c;内存管理和命令行参数处理是非常重要的技术&#xff0c;它们直接关系到程序的性能和灵活性。本文将深入探讨C语言中的内存管理和命令行参数处理&#xff0c;并提供相关示例代码。 内存管理 1.内存分配与释放 在C语言中&#xff0c;我们可以使用malloc函…

Zookeeper Java 开发,自定义分布式锁示例

文章目录 一、概述二、导入依赖包三、创建锁的过程3.1 通过 create 创建节点信息3.2 AsyncCallback.StringCallback 回调函数3.3 AsyncCallback.Children2Callback 的回调函数3.4 Watcher 的回调函数 四、完整示例4.1 完整分布式锁代码4.2 测试类 如果您还没有安装Zookeeper请看…

切换阿里云ES方式及故障应急处理方案

一、阿里云es服务相关问题及答解 1.1 ES7.10扩容节点时间 增加节点数量需要节点拉起和数据Rebalance两步,拉起时间7.16及以上的新版本大概10分钟以内,7.16以前大概一小时,数据迁移的时间就看数据量了,一般整体在半小时以内 (需进行相关测试验证) 1.2 ES7.10扩容数据节点…

在 Node.js 中发出 HTTP 请求的 5 种方法

在 Node.js 中发出 HTTP 请求的 5 种方法 学习如何在 Node.js 中发出 HTTP 请求可能会让人感到不知所措&#xff0c;因为有数十个可用的库&#xff0c;每个解决方案都声称比上一个更高效。一些库提供跨平台支持&#xff0c;而另一些库则关注捆绑包大小或开发人员体验。 在这篇…

云轴科技ZStack信创云平台支撑长江航务管理局35套航运管理系统

信创是数字中国建设的重要组成部分&#xff0c;也是数字经济发展的关键推动力量。作为云基础软件企业&#xff0c;云轴科技ZStack产品矩阵全面覆盖数据中心云基础设施&#xff0c;ZStack信创云首批通过可信云《一云多芯IaaS平台能力要求》先进级&#xff0c;是其中唯一兼容四种…

二百零三、Flume——Flume实时采集数据频率为1s的高频率Kafka数据直接写入ODS层表的HDFS文件路径下

一、目的 在离线数仓中&#xff0c;需要用Flume去采集Kafka中的数据&#xff0c;然后写入HDFS中。 由于每种数据类型的频率、数据大小、数据规模不同&#xff0c;因此每种数据的采集需要不同的Flume配置文件。玩了几天Flume&#xff0c;感觉Flume的使用难点就是配置文件 二、…

AOF是什么?

目录 一、AOF是什么&#xff1f; 二、使用AOF 三、命令写入 四、重写机制 4.1 触发AOF 4.2 AOF执行流程 一、AOF是什么&#xff1f; AOF是Append Only File&#xff0c;是Redis中实现持久化的一种方式。以独⽴⽇志的⽅式记录每次命令&#xff0c;重启时再重新执⾏ AOF ⽂件中的…

小程序富文本图片大小问题

文章目录 概要uniapp小程序情况解决方法及完整示例 概要 在小程序使用富文本或者在nuiapp&#xff08;小程序的&#xff09;使用富文本都会转为 <rich-text nodes"<p class"p class">内容</p>”></rich-text>如果是这种情况的话在css…

自动驾驶-BEV感知综述

BEV感知综述 随着自动驾驶传感器配置多模态化、多源化&#xff0c;将多源信息在unified View下表达变得更加关键。BEV视角下构建的local map对于多源信息融合及理解更加直观简洁&#xff0c;同时对于后续规划控制模块任务的开展也更为方便。BEV感知的核心问题是&#xff1a; …

飞书开发学习笔记(八)-开发飞书小程序Demo

飞书开发学习笔记(八)-开发飞书小程序Demo 一.小程序开发概述 1.1 小程序开发概述 飞书开发文档中查看&#xff1a;小程序开发概述 飞书小程序是指可以运行在飞书客户端中的小程序&#xff0c;小程序的一套代码可以适配 Android、iOS、PC 多平台&#xff0c;且用户体验与飞书…

VUE基础的一些实战总结

目录 创建一个 Vue 应用 步骤 1&#xff1a;安装 Node.js 和 npm 步骤 2&#xff1a;安装 Vue CLI 步骤 3&#xff1a;创建 Vue 项目 步骤 4&#xff1a;启动开发服务器 步骤 5&#xff1a;访问应用程序 步骤 6&#xff1a;编辑 Vue 应用 步骤 7&#xff1a;构建和部署…