【数据结构与算法】稀疏数组

文章目录

  • 一:为什么会使用稀疏数组
    • 1.1 先看一个实际的需求
    • 1.2 基本介绍
      • 1.2.1 稀疏数组的处理方法
      • 1.2.2 数组的举例说明
      • 1.2.3 应用实例
      • 1.2.4 整体思路分析
        • 二维数组转稀疏数组的思路
        • 稀疏数组转原始的二维数组的思路
  • 二:代码实现
    • 2.1 创建一个原始的11*11二维数组
    • 2.2 将二维数组转化为稀疏数组
    • 2.3 将稀疏数组恢复成原始的二维数组
    • 2.4 完整代码奉上

一:为什么会使用稀疏数组

1.1 先看一个实际的需求

  • 编写的五子棋程序中,有存盘退出和续上盘的功能
    在这里插入图片描述
  • 问题分析:因为该二维数组的很多值是默认值0, 因此记录了很多没有意义的数据。所以此时我们可以简化一下二维数组,使用稀疏数组来解决此问题。

1.2 基本介绍

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

1.2.1 稀疏数组的处理方法

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

1.2.2 数组的举例说明

在这里插入图片描述
注:

  1. 数组的下标都是从0开始,所以第一行,第四列用(0,3)表示
  2. 第一行【0】6 7 8 表示,共有6行、7列,有效数据有8个,其他行表示这8个数据具体的坐标。

1.2.3 应用实例

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

1.2.4 整体思路分析

在这里插入图片描述

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

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

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

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

二:代码实现

2.1 创建一个原始的11*11二维数组

0:表示没有棋子 1:表示黑子 2:表示白子

		int[][] chessArr1 = new int[11][11];chessArr1[1][2] = 1;chessArr1[2][3] = 2;chessArr1[4][9] = 3;chessArr1[6][3] = 4;chessArr1[9][10] = 5;//输出二维数组System.out.println("原始的二维数组");for (int[] row : chessArr1) {for (int data : row) {//换行输出System.out.printf("%d\t",data);}System.out.println();}

在这里插入图片描述

2.2 将二维数组转化为稀疏数组

  1. 遍历原始的二维数组,得到有效数据的个数sum
int sum = 0;for (int i = 0; i < chessArr1.length; i++) {for (int j = 0; j < chessArr1[0].length; j++) {if(chessArr1[i][j] != 0) {sum = sum + 1;}}}System.out.println("sum: " + sum);

输出:sum=5

  1. 创建对应的稀疏数组
int[][] sparseArray = new int[sum + 1][3];
  1. 给稀疏数组第一行赋值
		sparseArray[0][0] = chessArr1.length;sparseArray[0][1] = chessArr1[0].length;sparseArray[0][2] = sum;
  1. 给第其他行赋值,遍历二维数组将非0值存放到稀疏数组里面
//count用于记录第几个非0数据int count = 1;for (int i = 0; i < chessArr1.length; i++) {for (int j = 0; j < chessArr1[0].length; j++) {if(chessArr1[i][j] != 0) {sparseArray[count][0] = i;sparseArray[count][1] = j;sparseArray[count][2] = chessArr1[i][j];count = count + 1;}}}
  1. 输出稀疏数组
		System.out.println();System.out.println("得到的稀疏数组");for (int[] row : sparseArray) {for (int data : row) {//换行输出System.out.printf("%d\t",data);}System.out.println();}

在这里插入图片描述

2.3 将稀疏数组恢复成原始的二维数组

  1. 先读取稀疏数组的第一行。根据第一行的数据,创建二维数组
int[][] chessArr2 = new int[sparseArray[0][0]][sparseArray[0][1]];
  1. 读取稀疏数组的后几行数据(从第二行开始),并赋值给原始的二维数组即可
for (int i = 1; i < sparseArray.length; i++) {chessArr2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];}System.out.println("转化后的的二维数组");for (int[] row : chessArr1) {for (int data : row) {//换行输出System.out.printf("%d\t",data);}System.out.println();}

在这里插入图片描述

2.4 完整代码奉上

package com.sysg.dataStructuresAndAlgorithms.array;import java.util.Arrays;/*** 稀疏数组** 一:二维数组转稀疏数组的思路* 1.遍历原始的二维数组,得到有效数据的个数sum* 2.根据sum就可以创建稀疏数组(sparseArr ) int[sum+1][3]*** 二:将二维数组的有效数据数据存入到 稀疏数组* 1.稀疏数组转原始的二维数组的思路* 2.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的 chessArr12=int[11][11]* 3.在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可** @author shi.guangqiang*/
public class SparseArray {public static void main(String[] args) {//1.创建一个原始的二维数组 11*11//0:表示没有棋子 1:表示黑子 2:表示白子int[][] chessArr1 = new int[11][11];chessArr1[1][2] = 1;chessArr1[2][3] = 2;chessArr1[4][9] = 3;chessArr1[6][3] = 4;chessArr1[9][10] = 5;//输出二维数组System.out.println("原始的二维数组");for (int[] row : chessArr1) {for (int data : row) {//换行输出System.out.printf("%d\t",data);}System.out.println();}//2.将二维数组转化为稀疏数组的思路//2.1 遍历原始的二维数组,得到有效数据的个数sumint sum = 0;for (int i = 0; i < chessArr1.length; i++) {for (int j = 0; j < chessArr1[0].length; j++) {if(chessArr1[i][j] != 0) {sum = sum + 1;}}}System.out.println("sum: " + sum);//2.2 创建对应的稀疏数组int[][] sparseArray = new int[sum + 1][3];//2.3 给稀疏数组赋值//2.3.1 给第一行赋值sparseArray[0][0] = chessArr1.length;sparseArray[0][1] = chessArr1[0].length;sparseArray[0][2] = sum;//2.3.2 给第其他行赋值,遍历二维数组将非0值存放到稀疏数组里面//count用于记录第几个非0数据int count = 1;for (int i = 0; i < chessArr1.length; i++) {for (int j = 0; j < chessArr1[0].length; j++) {if(chessArr1[i][j] != 0) {sparseArray[count][0] = i;sparseArray[count][1] = j;sparseArray[count][2] = chessArr1[i][j];count = count + 1;}}}//3.输出稀疏数组System.out.println();System.out.println("得到的稀疏数组");for (int[] row : sparseArray) {for (int data : row) {//换行输出System.out.printf("%d\t",data);}System.out.println();}//4.将稀疏数组恢复成原始的二维数组//4.1 先读取稀疏数组的第一行。根据第一行的数据,创建二维数组int[][] chessArr2 = new int[sparseArray[0][0]][sparseArray[0][1]];//4.2 读取稀疏数组的后几行数据(从第二行开始),并赋值给原始的二维数组即可for (int i = 1; i < sparseArray.length; i++) {chessArr2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];}System.out.println("转化后的的二维数组");for (int[] row : chessArr1) {for (int data : row) {//换行输出System.out.printf("%d\t",data);}System.out.println();}}}

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

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

相关文章

CMake语法中的PUBLIC、PRIVATE、INTERFACE关键字含义

在CMake语法中&#xff0c;经常见到PUBLIC、PRIVATE、INTERFACE关键字&#xff0c;它们是什么意思呢&#xff1f;下面举例说明。 如上图,说明如下&#xff1a; RIVATE&#xff1a;私有的。生成 libhello-world.so时&#xff0c;只在 hello_world.c 中包含了 hello.h&#xff0…

Vision Transformer模型入门

Vision Transformer模型入门 一、Vision Transformer 模型1&#xff0c;Embedding 层结构详解2&#xff0c;Transformer Encoder 详解3&#xff0c;MLP Head 详解 二、ViT-B/16 网络结构三、Hybrid 模型详解四、ViT 模型搭建参数 一、Vision Transformer 模型 总体三个模块&am…

[Vue] Vue2和Vue3的生命周期函数

vue2有11个生命周期钩子, vue3有8个生命周期钩子 从vue创建、运行、到销毁总是伴随着各种事件, 创建、挂载、更新到销毁。 1.vue2系列生命周期 ⑴【beforecreate】实例创建前。 vue完全创建之前&#xff0c;会自动执行这个函数。 ⑵【Created】实例创建后。 这也是个生命…

商品推荐系统浅析 | 京东云技术团队

一、综述 本文主要做推荐系统浅析&#xff0c;主要介绍推荐系统的定义&#xff0c;推荐系统的基础框架&#xff0c;简单介绍设计推荐的相关方法以及架构。适用于部分对推荐系统感兴趣的同学以及有相关基础的同学&#xff0c;本人水平有限&#xff0c;欢迎大家指正。 二、商品…

Qt扫盲-Qt Model/View 理论总结 [下篇]

Qt Model/View 理论总结 [下篇] 一、处理I tem view 中的选择1. 概念1. 当前项目和已选项目 2. 使用选择 model1. 选择项目2. 读取选区状态3. 更新选区4. 选择 model 中的所有项 二、创建新 model1. 设计一个 model2. 只读示例 model1. model 的尺寸2. model 头和数据 3. 可编辑…

【LeetCode】122. 买卖股票的最佳时机 II - 贪婪算法

目录 2023-8-10 10:29:32 122. 买卖股票的最佳时机 II 2023-8-10 10:29:32 没错&#xff0c;还是用双指针思想来套出来的。 感觉步骤很复杂&#xff0c;还调试了半天。 class Solution {public int maxProfit(int[] prices) {int pre 0;int last 1;int maxProfit 0;int c…

Ubuntu18.04搭配无人机仿真环境(ROS,PX4,gazebo,Mavros,QGC安装教程)

Ubuntu18.04搭配无人机仿真环境 ROS环境配置版本安装 gazebo安装Mavrosa安装PX4源码下载和编译运行仿真地面站安装 ROS环境配置 我个人使用了代理环境进行下载。Linux没有代理的可以使用国内源。 清华大学源 sudo sh -c ‘. /etc/lsb-release && echo “deb http://m…

探索极限:利用整数或字符串操作找出翻转后的最大数字

本篇博客会讲解力扣“1323. 6 和 9 组成的最大数字”的解题思路&#xff0c;这是题目链接。 对于这道题目&#xff0c;我会讲解2种解题思路&#xff0c;分别是直接操作整数&#xff0c;和利用字符串操作。希望大家通过本题学习关于整数和字符串的技巧。 显然&#xff0c;这道题…

《华为认证》L2TP VPN配置

配置接口ip地址&#xff0c;并且将防火墙的接口加入对应的安全区域 。 LNS的G1/0/0 IP为202.1.1.1 1、配置LNS的缺省路由&#xff1a; ip route-static 0.0.0.0 0.0.0.0 202.1.1.2 2、通过WEB 界面配置防火墙的 L2TP VPN 浏览器输入&#xff1a; https://202.1.1.1:8443/def…

HTML详解连载(2)

HTML详解连载&#xff08;2&#xff09; 专栏链接 [link](http://t.csdn.cn/xF0H3)下面进行专栏介绍 开始喽超链接作用代码示例解释经验分享 音频标签代码示例注意强调 视频标签代码示例注意强调 列表作用&#xff1a;布局内容排列整齐的区域。分类&#xff1a;无序列表&#x…

商业智能BI,如何区别联机事务处理(OLTP)和联机分析处理(OLAP)

商业智能(Business Intelligence&#xff0c;简称&#xff1a;BI)&#xff0c;又称商业智慧或商务智能&#xff0c;指用现代数据仓库技术、线上分析处理技术、数据挖掘和数据展现技术进行数据分析以实现商业价值。 商业智能BI - 派可数据数据可视化分析平台 定义为下列软件工具…

Kotlin语法

整理关键语法列表如下&#xff1a; https://developer.android.com/kotlin/interop?hlzh-cn官方指导链接 语法形式 说明 println("count ${countnum}")字符串里取值运算 val count 2 var sum 0 类型自动推导 val 定义只读变量&#xff0c;优先 var定义可变变量…

小程序商城开发制作

当开发一个商城小程序时&#xff0c;费用是一个非常重要的考虑因素。然而&#xff0c;准确回答这个问题是有一定困难的&#xff0c;因为开发商城小程序的费用取决于多个因素。以下是一些可能影响价格的主要因素&#xff1a; 1. 功能需求&#xff1a;商城小程序的复杂程度和功能…

基于Spring Boot的网络在线学习网站的设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的网络在线学习网站的设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java spri…

无涯教程-Perl - opendir函数

描述 此函数使用readdir函数打开目录EXPR,并将其与DIRHANDLE关联以进行处理。 语法 以下是此函数的简单语法- opendir DIRHANDLE, EXPR返回值 如果成功,此函数将返回true。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perl -w$dirname"/tmp";opendir ( …

sentinel客户端和dashboard交互

回顾 在前面的章节中&#xff1a;通过阐述sentinel简单使用、滑动窗口、核心流程源码分析把sentinel限流、熔断等主要功能说明清楚了&#xff0c;但我们在实际使用的过程中&#xff0c;不可能通过硬编码的方式设置规则&#xff0c;且规则也没法直观的维护&#xff0c;为此肯定…

Spring-1-深入理解Spring XML中的依赖注入(DI):简化Java应用程序开发

学习目标 前两篇文章我们介绍了什么是Spring,以及Spring的一些核心概念&#xff0c;并且快速快发一个Spring项目&#xff0c;以及详细讲解IOC&#xff0c;今天详细介绍一些DI(依赖注入) 能够配置setter方式注入属性值 能够配置构造方式注入属性值 能够理解什么是自动装配 一、…

TFN 新推出信息安全产品 ,手机安全(插卡监听器)探测器 FW5 反窃听数字协议无线探测器

本产品是新研制的检测设备&#xff0c;工程师或反监测专家把它作为一个可靠的工具&#xff0c;用来 跟踪各种无线电数字传输设备&#xff0c;例如 GSM 、蓝牙等新型视听设备。随着现代科学技术 的不断发展&#xff0c;不同的数字传输方式已在我们的生活中得到了广泛的应用。例…

pytest fixture 常用参数

fixture 常用的参数 参数一&#xff1a;autouse&#xff0c;作用&#xff1a;自动运行&#xff0c;无需调用 举例一&#xff1a;我们在类中定义一个function 范围的fixture; 设置它自动执行autouseTrue&#xff0c;那么我们看下它执行结果 输出&#xff1a; 说明&#xff1a;…

EXPLAIN使用分析

系列文章目录 文章目录 系列文章目录一、type说明二、MySQL中使用Show Profile1.查看当前profiling配置2.在会话级别修改profiling配置3.查看profile记录4.要深入查看某条查询执行时间的分布 一、type说明 我们只需要注意一个最重要的type 的信息很明显的提现是否用到索引&…