6.8 稀疏数组

news2024/11/23 3:01:26

6.8 稀疏数组

稀疏数组是一种数据结构,在程序中数据结构的思想,是非常重要的。例如

  • 需求:编写五子棋游戏中,有存盘退出和续上盘的功能。
  • 分析问题:因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据,当存盘退出的时候,棋盘上有大量的默认值,存储没有必要。也是是我们可以编写一个压缩算法让我们的存储更为高效,也就是我们要学习的稀疏数组

一、稀疏数组介绍

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

  • 稀疏数组的处理方式是:

    1. 记录数据一共有几行几列,有多少个不同的值
    2. 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
  • 如图,左边是原始数组,右边是稀疏数组

    稀疏数组

示例

package com.baidu.www.array;

public class ArrayDemo08 {
    public static void main(String[] args) {
     //1、创建一个二维数组11*11 0代表没有棋子,1:黑棋,2:白棋
     int[][] array1 = new int[11][11];
     array1[1][2] = 1;
     array1[2][3] = 2;
     //输出原始的数组
     System.out.println("输出原始的数组");
     for(int[] ints : array1 ){
         for (int anInt: ints) {
             System.out.print(anInt+"\t");
         }
         System.out.println();
     }
        System.out.println("====================================");
     //转换为稀疏数组保存
     //1、获取有效值的个数
     int sum = 0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if(array1[i][j]!=0){
                    sum++;
                }
            }
        }
        System.out.println("有效值的个数为"+sum);
        //2、创建一个稀疏数组的数组
        int[][] array2 = new int[sum+1][3];//根据有效值的个数加一就能确定稀疏数组的行数
        array2[0][0]=11;
        array2[0][1]=11;
        array2[0][2]=sum;
        //3、遍历二维数组,将非零的值,存放稀疏数组中
        int count = 0;
        for (int i = 0; i < array1.length; i++) {
            for (int j = 0; j < array1[i].length; j++) {
                if(array1[i][j]!=0){
                    count++;//有了这个我们就知道里面存了多少个数字
                    array2[count][0]=i;
                    array2[count][1]=j;
                    array2[count][2]=array1[i][j];
                }
            }
        }
        //输出稀疏数组
        System.out.println("输出稀疏数组");
        for (int i = 0; i < array2.length; i++) {
            System.out.println(array2[i][0] + "\t" + array2[i][1] + "\t" + array2[i][2] + "\t");
        }
        System.out.println("====================================");
        System.out.println("还原稀疏数组");//相当于根据稀疏数组重新构建一个新的数组
        //1、先读取稀疏数组的值,定义一个新的数组
        int[][] array3 = new int[array2[0][0]][array2[0][1]];
        //2、给其中的元祖还原它的值
        for (int i = 1; i < array2.length; i++) {
            array3[array2[i][0]][array2[i][1]]=array2[i][2];
        }
        //3、输出还原后的数组
        System.out.println("输出还原的数组");
        for(int[] ints : array3 ){
            for (int anInt: ints) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }
    }
}
/*
* 输出原始的数组
0	0	0	0	0	0	0	0	0	0	0	
0	0	1	0	0	0	0	0	0	0	0	
0	0	0	2	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
====================================
有效值的个数为2
输出稀疏数组
11	11	2	
1	2	1	
2	3	2	
====================================
还原稀疏数组
输出还原的数组
0	0	0	0	0	0	0	0	0	0	0	
0	0	1	0	0	0	0	0	0	0	0	
0	0	0	2	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	

Process finished with exit code 0*/

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

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

相关文章

Meta押宝人工智能聊天机器人以留住用户

Meta计划发布具有人类个性的AI聊天机器人&#xff0c;这一举措旨在增强用户留存率。知情人士透露&#xff0c;该聊天机器人的原型已经在开发中&#xff0c;并有望在下个月月初推出。最终产品可以达到与用户进行正常讨论的人类水平。Meta员工将这些聊天机器人称为“personas”&a…

针对高可靠性和高性能优化的1200V硅碳化物沟道MOSFET

目录 标题&#xff1a;1200V SiC Trench-MOSFET Optimized for High Reliability and High Performance摘要信息解释研究了什么文章创新点文章的研究方法文章的结论 标题&#xff1a;1200V SiC Trench-MOSFET Optimized for High Reliability and High Performance 摘要 本文详…

【Java从入门到大牛】集合进阶下篇

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Java从入门到大牛 &#x1f320; 首发时间&#xff1a;2023年8月2日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e…

windows脚本 批量删除指定文件夹、指定文件

前言 用于批量删除项目中的测试数据&#xff0c;提供用户纯净的软件。 使用说明&#xff1a; 修改file_list和folder_list对应的数据&#xff0c;来自定义删除的内容 效果图 源码 echo off chcp 65001 > nul 2>&1REM 设置文件列表&#xff0c;可以包含多个文件路…

MySQL安装详细教程!!!

安装之前&#xff0c;先卸载你之前安装过的数据库程序&#xff0c;否则会造成端口号占用的情况。 1.首先下载MySQL:MySQL :: Download MySQL Community Server(下载路径) 2.下载版本不一样&#xff0c;安装方法略有不同&#xff1b;&#xff08;版本5的安装基本一致&#xff0…

STL 之 list接口的简单使用【C++】

文章目录 push_front &&pop_frontpush_back&&pop_backinserterase迭代器begin&& endrbegin和rend front&&backsizeresizeemptyclearsortspliceuniquemergereverse ![在这里插入图片描述](https://img-blog.csdnimg.cn/717807397d8d499d840aae2…

万宾智慧排水监测系统,实现城市排水“靶向治疗”

随着城市化进程的加速&#xff0c;排水系统面临着越来越多的挑战。传统排水系统在应对城市发展带来的水资源管理和环境保护问题时&#xff0c;往往显得力不从心。近年来&#xff0c;城市内涝、河水倒灌、雨污分流不到位、河道黑臭杂乱、水体污染、井盖异常、污水溢流发臭等民生…

cmake使用笔记

vim CMakeLists.txt mkdir build cd build cmake ..创建 CMakeLists.txt&#xff0c;添加内容 cmake_minimum_required(VERSION 3.26) #工程名称 project(hello) #宏定义 add_definitions(-D宏名称) #头文件路径 include_directories(${PROJECT_SOURCE_DIR}/inc) #搜索源文件…

前端Vue入门-day07-Vuex入门

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 自定义创建项目 vuex概述 构建 vuex [多组件数据共享] 环境 创建一个空仓库 state 状态 1. 提供数据&…

Android Gradle 骚操作,将两个项目合并到一个项目中

1. 前言 在工作中&#xff0c;由于各种原因&#xff0c;导致需要将两个可单独运行的App项目&#xff0c;合并到一个git仓库里&#xff0c;且单独的App项目里还有其他Module模块。 如果只是将两个项目复制到同一个文件夹下&#xff0c;还是得单独打开各个项目&#xff0c;是很不…

基础篇:多线程所需知识:RAII接口模式对生产者和消费者封装以及多batch实现

我们先来弄一个最基础的infer类&#xff1a; class Infer{ public: bool load_model(const string &file){context_ file;return true;} void forward(){if(context_.empty()){printf("加载模型异常\n");return;}printf("使用%s进行推理\n " , contex…

图解:订单系统的设计

目录 订单系统简介 1. 订单系统在企业中的角色 2. 订单系统与各业务系统的关系 3. 订单系统上下游关系 4. 订单系统的业务架构 订单系统核心功能 1. 订单中所包含的内容信息 2. 流程引擎 订单系统的发展 最后 本文主要讲述了在传统电商企业中&#xff0c;订单系统应承…

SpringCloud入门Day01-服务注册与发现、服务通信、负载均衡与算法

SpringCloudNetflix入门 一、应用架构的演变 伴随互联网的发展&#xff0c;使用互联网的人群越来越多&#xff0c;软件应用的体量越来越大和复杂。而传统单体应用 可能不足以支撑大数据量以及发哦并发场景应用的框架也随之进行演变从最开始的单体应用架构到分布式&#xff08…

RB-Heparin罗丹明B-肝素偶联物的合成【星戈瑞】

罗丹明B标记肝素是一种荧光标记的肝素探针。在生物医学和生物化学研究中&#xff0c;研究人员常常需要将特定的生物分子或化合物进行标记&#xff0c;以便能够在实验中可视化或追踪它们的位置和相互作用。 合成Rhodamine B-Heparin罗丹明B-肝素偶联物需要将罗丹明B染料与肝素进…

20款奔驰S350升级原厂HUD抬头显示系统,提升您的行车安全

HUD是平视显示器的简称&#xff0c;它原先是运用在航空器上的飞行辅助仪器。指飞行员不需要低头&#xff0c;就能够看到他需要的重要资讯。由于HUD的方便性以及能够提高飞行安全&#xff0c;这项技术后来也发展到汽车行业。汽车搭载的HUD抬头数字显示功能&#xff0c;是利用光学…

使用Linux部署Jpress博客系统

环境要求 linux系统&#xff1a;我使用的操作系统是CentOS7 数据库&#xff1a;mysql&#xff0c;也可以使用mariadb jdk&#xff1a;与你的Linux操作系统能兼容的版本 tomcat&#xff1a;我使用的是tomcat8版本 如果没有数据库&#xff0c;请先自行下载 如果没有安装jdk…

MySQL内置函数使用说明

MySQL函数使用说明 MySQL 是一个流行的关系型数据库管理系统&#xff0c;它提供了许多内置函数来处理和操作数据。这些函数可以简化数据库查询和操作的过程&#xff0c;提高代码的可读性和效率。以下是一些常见的 MySQL 内置函数及其使用说明和示例。 数值函数 ABS() 函数原…

带 SPI 接口的独立 CAN 控制器 SIT2515

 芯片功能与 MCP2515 完全一致  适用 CAN2.0B 1.0Mb/s 的速度 0-8 字节长度数据场 支持标准帧扩展帧和远程帧  接收缓存、掩码与过滤码 两个带有存储优先级的接收缓存器 6 个 29 位过滤码 2 个 29 位掩码  采用前两个字节的数据进行报文过滤  三…

android 如何分析应用的内存(十五)——Visual Studio Code 调试Android应用

android 如何分析应用的内存&#xff08;十五&#xff09;——Visual Studio Code 调试Android 应用 在上一篇文章介绍了jdb调试java应用 接下来介绍用UI界面调试java应用&#xff0c;达到同jdb一样的效果。 同样的UI界面有很多选择&#xff0c;如Eclipse&#xff0c;Android …

Qt 中引入ffmpeg 动态库

1、前期准备 在qt引入ffmpeg动态库的时候&#xff0c;需要准备ffmpeg的动态库和头文件。 2、打开qt项目 在qt项目的.pro文件中添加以下几行代码 INCLUDEPATH $$PWD/thirtLib/ffmpeg4.2/include win32: LIBS -L$$PWD/thirtLib/ffmpeg4.2/lib/ -lavcodec -lavdevice -lavf…