稀疏数组实现

博文主要是自己学习的笔记,供自己以后复习使用,
参考的主要教程是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.hqwc.cn/news/520262.html

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

相关文章

SqlServer如何查询mdf的数据库版本

问题描述 今天附件数据库一直报错&#xff0c;百思不得其姐。最后发现可能数mdf数据库版本太低了&#xff0c;那么如何查询mdf文件的数据库版本呢&#xff1f; 解决方案&#xff1a; DBCC CHECKPRIMARYFILE(C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL…

【Unity】【VR开发】用控制器摇杆改变Canvas的大小和位置

【背景】 做一个VR投屏工具,希望能够用右手控制器的摇杆,前后控制Canvas距离,左右控制Canvas大小。 【分析】 需要解决几个问题: 获取摇杆在横纵轴方向上的输入值需要通过合适的Event触发改变Canvas大小和距离的函数写具体的Canvas改变大小和距离的功能【技术选型】 VR…

Gin 获取请求参数

POST 请求参数 Gin 获取Post请求URL参数有三种方式 func (c *Context) PostForm(key string) string func (c *Context) DefaultPostForm(key, defaultValue string) string func (c *Context) GetPostForm(key string) (string, bool)大多数情况下使用的是application/x-www…

Cloud-Eureka服务治理-Ribbon负载均衡

构建Cloud父工程 父工程只做依赖版本管理 不引入依赖 pom.xml <packaging>pom</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.9.RELEA…

【嵌入式——QT】Model/View

【嵌入式——QT】Model/View 基本原理数据模型视图组件代理Model/View结构的一些概念QFileSystemModelQStringListModelQStandardItemModel自定义代理 基本原理 GUI应用程序的一个很重要的功能是由用户在界面上编辑和修改数据&#xff0c;典型的如数据库应用程序&#xff0c;数…

【ArcGIS Pro二次开发】(84):WPF_给Combobox加点料

一、要实现的功能 在WPF中&#xff0c;一个正常的Combobox是长这样的&#xff1a; 当点击下拉框的时候&#xff0c;下拉列表就是简单的文本&#xff0c;看起来很单一。 这里我们给它加点料&#xff0c;让它变成这样&#xff1a; 就是给文本前面加个图标&#xff0c;这个图标可…

高精度减法

#include<iostream> #include<vector>using namespace std;//判断是否有A>B, bool cmp(vector<int> &A,vector<int> &B) {if(A.size()!B.size()) return A.size()>B.size();for(int iA.size()-1;i>0;i--)if(A[i]!B[i])return A[i]>…

Manz高压清洗机S11-028GCH-High Quality Cleaner 操作使用说明492页

Manz高压清洗机S11-028GCH-High Quality Cleaner 操作使用说明492页

YOLOv9(2):YOLOv9网络结构

1. 前言 本文仅以官方提供的yolov9.yaml来进行简要讲解。 讲解之前&#xff0c;还是要做一些简单的铺垫。 Slice层不做任何的操作&#xff0c;纯粹是做一个占位层。这样一来&#xff0c;在parse_model时&#xff0c;ch[n]可表示第n层的输出通道。 Detect和DDetect主要区别还…

Django cookie 与 session

Django cookie 与 session Cookie 是存储在客户端计算机上的文本文件&#xff0c;并保留了各种跟踪信息。 识别返回用户包括三个步骤&#xff1a; 服务器脚本向浏览器发送一组 Cookie。例如&#xff1a;姓名、年龄或识别号码等。浏览器将这些信息存储在本地计算机上&#xf…

JS实现chatgpt数据流式回复效果

最近高了一个简单chatgpt对话功功能&#xff0c;回复时希望流式回复&#xff0c;而不是直接显示结果&#xff0c;其实很简单&#xff0c;前端流式读取即可&#xff0c;后端SSE实现流式传输 前端用到fetch获取数据&#xff0c;然后利用reader读取 let requestId parseInt(Ma…

勾股定理的七种经典证明

据说勾股定理约有500种证明方法&#xff0c;下面介绍几种经典的证明方法。 一、切割重拼法。 顾名思义&#xff0c;就是将图形切割成其他形式的图形&#xff0c;然后通过拼图转换为另一种图形&#xff0c;这个过程中图形的面积是不变的。 “赵爽弦图”是这种方法的经典应用&…