数据结构——>稀疏数组

2023-11-08

一、稀疏数组

1、定义

稀疏数组也叫稀疏矩阵,是普通数组的压缩,在这里我们可以说普通数组的无效数据量远远大于有效数据量

有效数据:在下方的例子中,非0数字就是有效数据

普通数组:
在这里插入图片描述

其稀疏数组表现形式为:
在这里插入图片描述

如果第一个例子没看懂,那我们再来举个例子

普通数组
在这里插入图片描述
在这一堆妹子里你是不是只想要杨x和赵x,你不想要凤x吧

稀疏数组
在这里插入图片描述

2、储存

上面我们说到稀疏数组是由普通数组压缩而来,那为什么我们要压缩呢?

1、原数组中存在大量无效数据,占用了大量存储空间,而真正有用的数据又少。
2、压缩可以减少不必要的空间浪费,加快磁盘IO

3、储存方式

1、普通储存

第一行就是数组的 总行数 总列数 总的非零数据个数
往下各行是 非0数据所在行 所在列 具体值

例如
在这里插入图片描述

解释:
7 7 7 代表这个数组是7行7列,有四个有效数字
1 2 1 代表在第一行,第二列,有效数据的值是1
往后同理

4、代码实现

a、普通数组——>稀疏数组

  1. 先遍历二维数组 得到非0数据的个数
  2. 创建对应的稀疏数组
  3. 遍历二维数组,将非0的值存放到 sparseArr中
public class SparseArray{
    public static void main(String[] args) {
        //创建一个原始的7*7的数组
        int chessArr1[][] = new int[7][7];
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;
        chessArr1[4][5] = 3;
        chessArr1[5][6] = 4;
        // 输出原始的二维数组
        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 < 7; i++) {
            for (int j = 0; j < 7; j++) {
                if (chessArr1[i][j] != 0) {
                    sum++;
                }
            }
        }

        // 2. 创建对应的稀疏数组
        int sparseArr[][] = new int[sum + 1][3];
        // 给稀疏数组赋值
        sparseArr[0][0] = 7;
        sparseArr[0][1] = 7;
        sparseArr[0][2] = sum;

        // 遍历二维数组,将非0的值存放到 sparseArr中
        int count = 0; //count 用于记录是第几个非0数据
        for (int i = 0; i < 7; i++) {
            for (int j = 0; j < 7; 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\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
        }
        System.out.println();
    }
}

这里说几行关键代码
在这里插入图片描述

这里的[sum+1][3]
代表稀疏数组的行,sum代表你这个稀疏数组里的有效数据的个数,加的一代表稀疏数组第0行,也就是稀疏数组的行数,列数,有效数据个数这一行。

b、稀疏数组——>普通数组

//稀疏数组————>二维数组
        //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();
        System.out.println("恢复后的二维数组");

        for (int[] row : chessArr2) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }

思路:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构——>稀疏数组 的相关文章

随机推荐

  • UbuntuServer虚拟机安装

    UbuntuServer虚拟机安装 目录 UbuntuServer虚拟机安装 环境 步骤 创建UbuntuServer虚拟机 UbuntuServer安装 环境 VMware Workstation Pro 15 1 0 Ubuntu Se
  • 【Spark NLP】第 2 章:自然语言基础

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • pycharm下载安装

    接下来安装pycharm 1 首先从网站下载pycharm 点击打开链接 链接为 http www jetbrains com pycharm download section windows 进入之后如下图 根据自己电脑的操作系统进行选择
  • Linux的介绍

    简介 主要介绍Linux的概念 Linux是一款操作系统 类似与Windows 开源 免费 安全 高校 稳定 非常擅长处理高并发 现在大多数企业级项目都是部署在Linux系统的服务器中运行 Linux的创始人是Linus 吉祥物是一只叫Tu
  • 深入理解Mysql索引底层数据结构与算法

    索引是帮助MySQL高效获取数据的排好序的数据结构 索引数据结构对比 二叉树 左边子节点的数据小于父节点数据 右边子节点的数据大于父节点数据 如果col2是索引 查找索引为89的行元素 那么只需要查找两次 就可以获取到行元素所在的磁盘指针地
  • [labtools 27-2269]no devices detected on target localhost问题解决

    小白刚学FPGA 以流水灯为例入门 在连接板子的时候遇到了这个问题 记录一下 板子型号 xc7z045ffg900 2 解决办法之一 按照table 1 11更改图1 3里34位置处拨码
  • Linux系统中 systemd-journaldCPU占用异常的解决方法

    一 待解决问题 先贴几张图 问题解决之前最头疼的问题 因打印日志的高占用 以致CPU占用高达96 已经无法满足日常使用 从图中可见systemd journald占用了1 4的CPU资源 注 我是用的是Deepin系统 二 解决办法 因为要
  • SpringBoot2.x 集成Hadoop3.0.3 实现HDFS文件系统管理

    任务要求 搭建SpringBoot 2 x 集成Hadoop3 0 3环境 实现Hadoop 重要组成部分HDFS 文件系统管理的封装 核心pom xml 文件
  • vSphere之vCLS

    vCLS vSphere Cluster Services 是在vSphere7 0U1引入的集群服务 它使用代理虚拟机维护集群服务的运行状况 当主机添加到集群时 将创建 vCLS 代理虚拟机 vCLS vm 每个 vSphere 集群中最
  • Dell工作站8T硬盘安装ubuntu 16.04

    Dell工作站8T硬盘安装ubuntu 16 04 MBR文件系统仅支撑2T磁盘 因此在2T以上磁盘上安装ubuntu时 如果想利用全部磁盘空间 需要采用GPT分区 文件系统 模型 这需要重新分区 制作Ubuntu 16 04启动U盘 一
  • js-语言基础进阶-变换按钮的实现

    作者 芝士小熊饼干 系列专栏 数据结构 蓝桥杯 算法 坚持天数 16天
  • 从零搭建Maven私有仓库

    前言 主要使用到的技术 linux docker sonatype nexus maven 1 nexus3介绍 世界上第一个也是唯一一个免费使用的通用工件存储库 2 使用docker安装nexus3 1 下载 使用命令 docker pu
  • 20201105枚举课后总结

    文章目录 枚举 210733 奶牛碑文 http wikioi cn problem 210733 题目描述 输入格式 输出格式 样例输入 样例输出 思路 1 2 代码 210792 分解质因数 http wikioi cn problem
  • java会话技术--03--Session覆盖问题

    java会话技术 03 Session覆盖问题 代码位置 https gitee com DanShenGuiZu learnDemo tree master sessionCookie learn 1 现象 同一域名 同一个服务 不同的端
  • 如何在 vue 项目中引入高德地图

    文章目录 前言 一 申请 地图api开发者key 二 在vue项目安装高德地图的包 三 使用 1 在自己的组件中引入高德地图类 2 编写初始化函数 3 添加插件 前言 相信在 web 开发中有不少项目都用到过地图 那么我们怎么在自己的项目中
  • 程序删除自己

    void DeleteApplicationSelf std string strFileName this char szCommandLine MAX PATH 10 设置本进程为实时执行 快速退出 SetPriorityClass G
  • RabbitMQ消息队列实战(1)—— RabbitMQ的体系

    RabbitMQ是一个开源的消息代理和队列服务器 用来在不同的应用之间共享数据 1983年 被认为是RabbitMQ的雏形的Teknekron创建 首次提出了消息总线的概念 中间经历过数个阶段的发展 一直到2004年 AMQP Advanc
  • Makefile中的$@ $^等常见的符号解析

    之前学过一些Makefile 但是长时间不看 里面的符号又不少 慢慢就忘记了 这次在看Makefile文件 就顺带整理一些常用的符号 以后查询起来也方便 表示目标 表示所有的依赖 lt 表示第一个依赖 即时赋值 延时赋值 附加 例如 CC
  • bluestore中lru和2q缓存和onode_map的联系

    collection对应于某个pg 里面有OnodeSpace结构的onode map变量 OnodeSpace结构的变量内又有Cache结构的cache指针变量和unordered map的onode map变量 这个onode map变
  • 数据结构——>稀疏数组

    一 稀疏数组 1 定义 稀疏数组也叫稀疏矩阵 是普通数组的压缩 在这里我们可以说普通数组的无效数据量远远大于有效数据量 有效数据 在下方的例子中 非0数字就是有效数据 普通数组 其稀疏数组表现形式为 如果第一个例子没看懂 那我们再来举个例子