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

文章目录

  • 一:为什么会使用稀疏数组
    • 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://xiahunao.cn/news/1380262.html

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

相关文章

一文盘点 Zebec 生态的几个利好预期

Zebec Protocol 是目前商业进展最快的流支付体系&#xff0c;也是推动流支付向 Web2 世界发展的主要生态。目前&#xff0c;其已经与包括 Visa、Master 等支付巨头展开了合作&#xff0c;以推出银行卡的方式进一步向金融发达地区推出 Zebec Card 以拓展业务&#xff0c;前不久其…

人大金仓三大兼容:Oracle迁移无忧

企业级应用早期的架构模式是C/S&#xff08;Client/Server&#xff09;模式&#xff0c;Client做人机交互逻辑的呈现&#xff0c;Sever做业务计算逻辑的实现。这就类似餐馆的运作模式&#xff0c;Client是前台的服务员提供点菜和上菜服务&#xff0c;而Server则是后厨完成菜品的…

windows7专业版_windows7专业版和旗舰版的区别

&#xff37;indows7专业版和旗舰版有什么区别&#xff0c;二者有什么不同&#xff0c;相信有很多小伙伴还是不太了解的&#xff0c;下面就来为大家解答一下&#xff37;indows7专业版和旗舰版的区别&#xff1a; &#xff37;indows7专业版和旗舰版的区别 1、Windows7专业版&a…

【学习日记】【FreeRTOS】手动任务切换详解

前言 本文是关于 FreeRTOS 中实现两个任务轮流切换并执行的代码详解。目前不支持优先级&#xff0c;仅实现两个任务轮流切换。 一、任务的自传 任务从生到死的过程究竟是怎么样的呢&#xff1f;&#xff08;其实也没死&#xff09;&#xff0c;这个问题一直困扰着我&#xf…

服务器系统2012r2升级专业版,Windows Server 2012 R2版本区别

慕工程0101907 Windows Server 2012 R2是最新的服务器版本Windows&#xff0c;于2013年10月18日发布。这是Windows 8.1的服务器版本&#xff0c;在2013年6月3日的TechEd北美公布。Windows Server 2012&#xff0c;Datacenter和Standard版功能相同&#xff0c;变化只有授权&…

win7家庭版和旗舰版区别_Win7 ultimate是什么版本?ultimate是什么意思功能区别介绍!...

Win7 ultimate是什么版本&#xff1f;ultimate是什么意思功能区别介绍&#xff01; 对于Win7系统很多朋友都会觉的是一款很好用的操作系统&#xff0c;Win7系统的版本有很多种&#xff0c;那么Win7 ultimate是什么版本&#xff1f;win7这么多版本又有什么区别呢&#xff1f; Wi…

金蝶KIS旗舰版和K3wise的区别

金蝶KIS旗舰版就是金蝶K/3rise&#xff0c;也就是以前经常说的K3成长版 金蝶ERP系统&#xff0c;为金蝶集团专为中小企业设置的个性化ERP系统&#xff0c;现主要分为两个版本&#xff1a;K/3 WISE版本&#xff0c;KIS旗舰版&#xff08;前身金蝶K3rise&#xff09;&#xff0c;…

10 ping不通widwos7 windwos_w7专业版和旗舰版的区别讲解

微软发布的windows7系统有非常多的版本&#xff0c;网友们知道w7专业版和旗舰版的区别在哪里吗?相信有非常多的网友都被w7专业版和旗舰版的区别这个问题给难倒了。不过不用担心&#xff0c;windows7之家小编已经把w7专业版和旗舰版的区别讲解给网友们准备好了。 相关文章推荐&…

win7家庭版和旗舰版区别_Windows系统的家庭版、专业版、旗舰版,都有什么区别?...

现在主流电脑系统的是Win7和Win10,但是对于这两个系统的本身,也有版本的区别,也就是我们听说的家庭版、专业版、旗舰版等。 对于Win7系统来说,它一共有6个版本,分别为:初级版、家庭普通版、家庭高级版、专业版、企业版、旗舰版,它们的功能也是越来越强大。 今天我们就来…

服务器版系统和w7区别,小编告诉大家W7精简版和旗舰版啥区别

最近有网友给windows7之家小编留言问我W7精简版和旗舰版啥区别?他现在非常纠结不知道安装哪个版本的windows7系统好。其实网友提出的W7精简版和旗舰版啥区别这个问题解决起来非常简单。下面小编告诉大家W7精简版和旗舰版啥区别吧。 一、家庭普通版 功能&#xff1a;无限应用程…

国产航顺HK32F030M: 内部参考电压

HK32F030MF4P6 用户手册 内部参考电压 adc.c #include "bsp_adc.h"/*** brief ADC GPIO 初始化* param 无* retval 无*/ static void ADCx_GPIO_Config(void) {GPIO_InitTypeDef GPIO_InitStructure;// 打开 ADC IO端口时钟ADC_GPIO_AHBxClock_FUN ( ADC_GPIO_C…

怎么通过苹果HEIC图片转换器将heic格式转换为其他格式?

相信苹果用户对于heic图片并不陌生&#xff0c;十三日凌晨刚刚举行了今年的苹果发布会&#xff0c;并没有提及到系统更新的话题&#xff0c;所以目前最新系统依旧是iOS11&#xff0c;前两年更新的系统对于拍照格式的变化果粉有目共睹&#xff0c;可以说这个系统利弊同在&#x…

iPhone的照片格式 HEIC

今天把手机的照片扔到电脑 结果不是jpg格式 是heic 通通打不开 后来就去下了heic-converter 挺好用的 也没有浮水印 也有一次转一个资料夹的功能 放在我的下载空间 没点数也可以私我 https://me.csdn.net/download/GTWLin

如何将苹果HEIC图片转换为普通图片

HEIC是新出的一种图像格式&#xff0c;苹果的iOS 11更新后&#xff0c;iPhone 7及其后硬件&#xff0c;在拍摄照片时默认存储为HEIC格式。与JPG相比&#xff0c;它占用的空间更小&#xff0c;画质更加无损。HEIC格式照片支持iOS11及macOS High Sierra&#xff08;10.13&#xf…

IOS11苹果Heic图片转换成JPG怎么转?

HEIC是新出的一种图像格式&#xff0c;苹果的iOS 11更新后&#xff0c;iPhone 7及其后硬件&#xff0c;在拍摄照片时默认存储为HEIC格式比jpp,png bmp格式占用空间更小&#xff0c;画质清晰&#xff0c;想要在windows电脑中查看HEIC图片&#xff0c;是炫耀先将HEIC转JPG|png|bm…

怎么打开苹果heic图片,heic是什么文件?

ISO系统在更新到IOS11版本后&#xff0c;iphone手机拍摄的文件格式为HEIC格式图片&#xff0c;上传到电脑端&#xff0c;无法打开&#xff0c;很多软件也无法打开 &#xff0c;在win7和win10系统下可以使用 heic图片转换精灵软件&#xff0c;把heic格式的图片转成jpg或者pn格式…

转换heic图片的方法—苹果HEIC图片转换器

电脑怎么打开heic文件&#xff0c;很多人都会有这样的疑问&#xff0c;需要将其格式转换一下才能在电脑上打开查看&#xff0c;那一起看一下转换heic图片的方法吧&#xff01; 1、首先在电脑上运行苹果HEIC图片转换器&#xff0c;这类的工具还是蛮多的&#xff0c;但是易操作是…

苹果手机heic格式照片怎么转成jpg

苹果自iOS11系统之后默认的是heic图片格式&#xff0c;在电脑和安卓中都无法直接查看&#xff0c;需要将其转换图片格式&#xff0c;苹果手机heic格式照片怎么转成jpg&#xff1f;下面我们一起来看看吧&#xff01; 使用工具&#xff1a; 电脑、图片 操作方法&#xff1a; 1、…

如何将苹果手机heic格式转化jpg

如何将苹果手机heic格式转化jpg&#xff1f;大家都知道现在的苹果手机拍照后的图片格式是heic格式的&#xff0c;这是一种苹果专用的图片格式&#xff0c;如果将heic格式图片放到电脑上是不能正常打开了&#xff0c;而且大部分的平台都不知道heic格式图片的使用和上传&#xff…

苹果的heic格式图片怎么转换成jpg

苹果的heic格式图片怎么转换成jpg&#xff1f;heic格式的出现是在苹果iOS的系统更新到iOS11之后&#xff0c;是苹果系统的专属照片格式&#xff0c;不能跨设备直接使用。其实不光是heic格式&#xff0c;历来苹果系统的各种格式都无法在其他设备直接使用。而我们解决这个问题的方…