稀疏数组实现

博文主要是自己学习的笔记,供自己以后复习使用,
参考的主要教程是B站的
尚硅谷数据结构和算法

稀疏数组(sparse array)

实际需求:五子棋程序中的存盘退出和续上盘的功能

在这里插入图片描述

问题分析:

如果直接用二维数组,很多值是默认值0, 因此记录了很多没有意义的数据.->稀疏数组。
存盘:二维数组–>稀疏数组来–>持久化到磁盘中
续盘:将磁盘中的内容导入–>稀疏数组–>恢复二维数组

稀疏数组

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

稀疏数组的处理方法是:

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

举例:
在这里插入图片描述
在这里插入图片描述
第0行存储该二维数组有几行,几列,几个非空值
其余的行一次存储非空值的位置和值的大小

JAVA实现

public class SparseArray {public static void main(String[] args) {//创建一个原始的二维数组11*11//0:表示没有棋子,1:表示有棋子int chessArr1[][] = new int[11][11];chessArr1[1][2] = 1;chessArr1[2][3] = 2;chessArr1[4][5] = 3;//输出原始的二维数组System.out.println("原始的二维数组~~~~~~~~~~~~~~~~");for(int[] row :chessArr1){for(int data: row){System.out.printf("%d\t", data);}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;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("输出的稀疏数组为~~~~~~~~~~~~~~~~");for(int i = 0; i < sparseArr.length; i++) {System.out.printf("%d\t%d\t%d\t",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);System.out.println();}//恢复成原始数组//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.out.println("恢复的二维数组~~~~~~~~~~~~~~~~");for(int[] row :chessArr2){for(int data: row){System.out.printf("%d\t", data);}System.out.println();}}
}

结果如下:
在这里插入图片描述

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

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

相关文章

定时执行专家V7.1 多国语言版本日文版发布 - タスク自動実行ツールV7.1 日本語版リリース

◆ 软件介绍  ソフトの紹介 《定时执行专家》是一款制作精良、功能强大、毫秒精度、专业级的定时任务执行软件。软件具有 25 种【任务类型】、12 种【触发器】触发方式&#xff0c;并且全面支持界面化【Cron表达式】设置。软件采用多线程并发方式检测任务触发和任务执行&…

前端性能优化 | CDN缓存

前言 CDN&#xff08;Content Delivery Network&#xff09;是一种分布式的网络架构&#xff0c;通过在全球各地部署节点服务器来快速传输和分发网络内容。CDN的主要目标是提供快速、可靠的内容传输&#xff0c;以提升用户体验。 本文主要从以下方面讲解CDN 什么是CDNCDN的作…

解决Git报错:fatal: detected dubious ownership in repository at

在通过 Git Bash 提交项目代码时输入 git add . 命令后&#xff0c;报错&#xff1a;fatal: detected dubious ownership in repository at 这是因为该项目的所有者与现在的用户不一致 比如说&#xff1a; 该项目的所有者是 Administrator&#xff0c;而当前用户是 YuYang, 那…

java 初始化流程?

Java类的初始化流程是指在类被加载到内存并且链接完成后&#xff0c;执行类的初始化操作的过程。在Java中&#xff0c;类的初始化是在以下情况下触发的&#xff1a; 创建类的实例&#xff1a;当使用new关键字创建类的实例时&#xff0c;会触发类的初始化。 访问类的静态成员&a…

外贸常用的出口认证 | 全球外贸数据服务平台 | 箱讯科技

出口认证是一种贸易信任背书&#xff0c;对许多外贸从业者而言,产品的出口认证和当前的国际贸易环境一样复杂多变&#xff0c;不同的目标市场、不同的产品类别,所需要的认证及标准也不同。 国际认证 01 IECEE-CB IECEE-CB体系的中文含义是“关于电工产品测试证书的相互认可体…

数据库-第六/七章 关系数据理论和数据库设计【期末复习|考研复习】

前言 总结整理不易&#xff0c;希望大家点赞收藏。 给大家整理了一下数据库系统概论中的重点概念&#xff0c;以供大家期末复习和考研复习的时候使用。 参考资料是王珊老师和萨师煊老师的数据库系统概论(第五版)。 文章目录 前言第六章 关系数据理论6.1 规范化6.2 范式6.3 规范…

C#,入门教程(26)——数据的基本概念与使用方法

上一篇&#xff1a; C#&#xff0c;入门教程(25)——注释&#xff08;Comments&#xff09;你会吗&#xff1f;看多图演示&#xff0c;学真正注释。https://blog.csdn.net/beijinghorn/article/details/124681888 本文所述的知识基本上适用于C/C&#xff0c;java等其他语言。 …

2575. 找出字符串的可整除数组

2575. 找出字符串的可整除数组 题目链接&#xff1a;2575. 找出字符串的可整除数组 代码如下&#xff1a; class Solution { public:vector<int> divisibilityArray(string word, int m) {vector<int> res;long long num0;for(int i0;i<word.size();i){num(nu…

vue 2 和 vue 3 在自定义组件中如何使用v-model

vue2自定义事件 前言&#xff1a; 众所周知 vue2 中v-model其实就是 :value“val” input“(e) > {val e.target.value}” 的语法糖&#xff0c;所以只要理解了他其实就是语法糖就好处理了 父组件 <template><div><div>父组件</div><Sun v-mo…

基础算法(五)(进制转换)

1.进制的本质 对于一个十进制数字&#xff0c;比如说153&#xff0c;其本质是每一个数位上的数字乘上这一位上的权重&#xff0c;即&#xff1a;153&#xff08;110^2&#xff09;&#xff08;510^1&#xff09;&#xff08;310^0&#xff09; 而二进制&#xff0c;只不过是把…

LVS集群 ----------------(直接路由 )DR模式部署

一、LVS集群的三种工作模式 lvs-nat&#xff1a;修改请求报文的目标IP,多目标IP的DNAT lvs-dr&#xff1a;操纵封装新的MAC地址&#xff08;直接路由&#xff09; lvs-tun&#xff1a;隧道模式 lvs-dr 是 LVS集群的 默认工作模式 NAT通过网络地址转换实现的虚拟服务器&…

在分布式环境中使用状态机支持数据的一致性

简介 在本文中&#xff0c;我们将介绍如何在分布式系统中使用transaction以及分布式系统中transaction的局限性。然后我们通过一个具体的例子&#xff0c;介绍了一种通过设计状态机来避免使用transaction的方法。 什么是数据库transaction Transaction是关系型数据普遍支持的…

java SSM流浪宠物救助与领养myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM流浪宠物救助与领养管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系…

安卓Java面试题21-30

🔥 21、AsyncTask使用在哪些场景?它的缺陷是什么?如何解决?🔥 AsyncTask 运用的场景就是我们需要进行一些耗时的操作,耗时操作完成后更新主线程,或者在操作过程中对主线程的UI进行更新。 缺陷: AsyncTask中维护着一个长度为128的线程池,同时可以执行5个工作线程,还…

Fragment

1.网格视图(随便插进来一条) 2.Fragment

谷歌开源的LLM大模型 Gemma 简介

相关链接&#xff1a; Hugging face模型下载地址&#xff1a;https://huggingface.co/google/gemma-7bGithub地址&#xff1a;https://github.com/google/gemma_pytorch论文地址&#xff1a;https://storage.googleapis.com/deepmind-media/gemma/gemma-report.pdf官方博客&…

Linux——文件标识符

目录 一、文件基础 二、常见的C语言文件接口 三、系统文件接口 四、理解语言与系统文件操作的关系 五、如何理解一切皆文件 六、文件标识符再理解 一、文件基础 一个空文件&#xff0c;也会占用磁盘空间&#xff0c;这是因为文件不仅仅有存放在里面的内容&#xff0c;还…

IO:实现文件拷贝的各种方法(观察每种函数中的参数和结束条件)

一、使用fscanf实现&#xff0c;将一个文件中的数据打印到终端上&#xff08;类似于cat一个文件&#xff09; #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat…

数组中删改元素(数据结构、顺序表、线性表)

给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面…

Chapter20-Ideal gases-CIE课本要点摘录、总结(编辑中)

20.1 Particles of a gas Brownian motion Fast modules 速率的数值大概了解下&#xff1a; average speed of the molecules:400m/s speed of sound:approximately 330m/s at STP&#xff08;standard temperature and pressure&#xff09; Standard Temperature and Pres…