稀疏数组举例详解(Java形式表示)

news2024/11/15 15:58:47

稀疏数组

  • 稀疏数组的定义
  • 稀疏数组的形式
  • 稀疏数组的用途
  • Java形式实现稀疏数组
    • 1.创建稀疏矩阵
    • 2.遍历矩阵提取有效元素个数,来确立稀疏数组创建的行数(行数=有效元素个数+1)
    • 3.通过有效元素个数创建稀疏数组的个数
    • 4.填入初始行(第一行)数据
    • 5.填入后续行数据
    • 6.将稀疏数组数据打印在控制台上
    • 7.学会了压缩,当然也要学会解压缩
    • 附上面所有的组成的整体代码
  • Java形式表示稀疏数组并结合IO流

在这里插入图片描述

稀疏数组的定义

稀疏数组是一种表示稀疏矩阵的数据结构。(在编程中,我们常以二维数组来表示矩阵
一个矩阵被称为稀疏矩阵,当其中大部分元素都是0时。
稀疏数组通过记录非零元素的行、列和值来表示一个稀疏矩阵,从而节省存储空间。

在这里插入图片描述

稀疏数组的形式

具体地说,稀疏数组通常以三列形式存储:第一列表示非零元素的行,第二列表示非零元素的列,第三列表示非零元素的值。
不过第一行有点特殊,具体看图
类似于这样:

在这里插入图片描述

例如一个8行8列的稀疏矩阵,里面有三个有效的元素(颜色为红色的)需要我们记录:
在这里插入图片描述

第一行,我们知道了矩阵是8*8的,同时知道矩阵中有效元素有3个,然后剩下的三行就把有效元素的行列坐标与值依次填入就行。
在这里插入图片描述

稀疏数组的用途

稀疏矩阵的存储:

对于一个非常大的矩阵,如果其中大部分元素都是0,那么可以使用稀疏数组来存储这个矩阵,从而节省存储空间。

图像处理:

在图像处理中,通常需要处理大量的像素,而大部分像素的取值都是相同的。这时候可以使用稀疏数组来存储图像数据,只记录非零的像素值,从而节省存储空间和加快处理速度。

网络图:

在网络图中,通常需要记录节点之间的连接关系。如果节点之间的连接关系比较稀疏,可以使用稀疏数组来存储连接关系,只记录存在连接的节点,从而节省存储空间和加快处理速度。

后面两个比较高级,我还没真正使用过,所以我只用第一个用途为例。

Java形式实现稀疏数组

1.创建稀疏矩阵

 int[][] sparseArrays=new int[8][8];
        //假设里面只有3个有效数据
        sparseArrays[2][3]=1;
        sparseArrays[3][4]=2;
        sparseArrays[6][3]=3;

2.遍历矩阵提取有效元素个数,来确立稀疏数组创建的行数(行数=有效元素个数+1)

当然也可以采用动态创建或者利用Java中的集合来动态添加,这里就不用那些复杂的了

第一步:遍历待压缩矩阵,提取有效元素个数
        int value_sum=0;//有效数据的总数
        for (int i = 0; i < sparseArrays.length; i++) {
            for (int j = 0; j < sparseArrays[i].length; j++) {
              if(sparseArrays[i][j]!=0) {
                    value_sum++;
              }
            }
        }
 遍历完成后就能得到有效元素的个数

3.通过有效元素个数创建稀疏数组的个数

第二步:创建压缩数组,将值写入
        int[][] compressed_arrays=new int[value_sum+1][3];

4.填入初始行(第一行)数据

第三步:压缩后的数组首行对应分别是稀疏数组的行,列,有效值总数
        compressed_arrays[0][0]=sparseArrays.length;
        compressed_arrays[0][1]=sparseArrays[0].length;
        compressed_arrays[0][2]=value_sum;

5.填入后续行数据

第四步:再次遍历矩阵,将有效元素的行列坐标和值拿到
int count=0;//临时计数器
        for (int i = 0; i < sparseArrays.length; i++) {
            for (int j = 0; j < sparseArrays[i].length; j++) {
                if(sparseArrays[i][j]!=0) {
                    compressed_arrays[count+1][0]=i;
                    compressed_arrays[count+1][1]=j;
                    compressed_arrays[count+1][2]=sparseArrays[i][j];
                    //将具体的有效值插入到压缩中的数组中
                    count++;
                }
            }
        }

6.将稀疏数组数据打印在控制台上

//展示压缩后的数组
        for (int i = 0; i < compressed_arrays.length; i++) {
            System.out.printf("[\t");
            for (int j = 0; j < compressed_arrays[i].length; j++) {
                    System.out.printf("%d\t",compressed_arrays[i][j]);

            }
            System.out.println("]");
        }

在这里插入图片描述

7.学会了压缩,当然也要学会解压缩

恢复稀疏数组成稀疏矩阵
        System.out.println("恢复成正常数组");
        int[][] normalArrays=new int[compressed_arrays[0][0]][compressed_arrays[0][1]];
        for (int i=1;i<compressed_arrays.length;i++){
            normalArrays[compressed_arrays[i][0]][compressed_arrays[i][1]]=compressed_arrays[i][2];
        }
        for (int i = 0; i < normalArrays.length; i++) {
            System.out.printf("[\t");
            for (int j = 0; j < normalArrays[i].length; j++) {
                System.out.printf("%d\t",normalArrays[i][j]);

            }
            System.out.println("]");
        }

附上面所有的组成的整体代码

顺便加上了几次输出,让过程更明显

public class SparseArrays {
    //自己创建一个稀疏数组
    public static void main(String[] args) {

        int[][] sparseArrays=new int[8][8];
        //假设里面只有3个有效数据
        sparseArrays[2][3]=1;
        sparseArrays[3][4]=2;
        sparseArrays[6][3]=3;
        //二维数组打印遵循先行后列的嵌套循环
        for (int i = 0; i < sparseArrays.length; i++) {//这里的length字段是二维数组的行数
            System.out.printf("[\t");
            for (int j = 0; j < sparseArrays[i].length; j++) {//这里的length字段反映的是二维数组所在行的长度
                System.out.printf("%d\t",sparseArrays[i][j]);
            }
            System.out.println("]");
            System.out.println();
        }
//        第一步:遍历待压缩数组,提取有效信息。
        int value_sum=0;//有效数据的总数
        for (int i = 0; i < sparseArrays.length; i++) {
            for (int j = 0; j < sparseArrays[i].length; j++) {
              if(sparseArrays[i][j]!=0) {
                    value_sum++;
              }
            }
        }


        System.out.println("将其进行压缩");
        //第二步:创建压缩数组,将值写入
        int[][] compressed_arrays=new int[value_sum+1][3];
        //压缩后的数组首行对应分别是稀疏数组的行,列,有效值总数
        compressed_arrays[0][0]=sparseArrays.length;
        compressed_arrays[0][1]=sparseArrays[0].length;
        compressed_arrays[0][2]=value_sum;
        int count=0;//临时计数器
        for (int i = 0; i < sparseArrays.length; i++) {
            for (int j = 0; j < sparseArrays[i].length; j++) {
                if(sparseArrays[i][j]!=0) {
                    compressed_arrays[count+1][0]=i;
                    compressed_arrays[count+1][1]=j;
                    compressed_arrays[count+1][2]=sparseArrays[i][j];//将具体的有效值插入到压缩中的数组中
                    count++;
                }
            }
        }
        //展示压缩后的数组
        for (int i = 0; i < compressed_arrays.length; i++) {
            System.out.printf("[\t");
            for (int j = 0; j < compressed_arrays[i].length; j++) {
                    System.out.printf("%d\t",compressed_arrays[i][j]);

            }
            System.out.println("]");
        }


        //恢复压缩数组成正常数组
        System.out.println("恢复成正常数组");
        int[][] normalArrays=new int[compressed_arrays[0][0]][compressed_arrays[0][1]];
        for (int i=1;i<compressed_arrays.length;i++){
            normalArrays[compressed_arrays[i][0]][compressed_arrays[i][1]]=compressed_arrays[i][2];
        }
        for (int i = 0; i < normalArrays.length; i++) {
            System.out.printf("[\t");
            for (int j = 0; j < normalArrays[i].length; j++) {
                System.out.printf("%d\t",normalArrays[i][j]);

            }
            System.out.println("]");
        }
    }
}

Java形式表示稀疏数组并结合IO流

这里本质就是将读取内存里的稀疏矩阵和稀疏数组和输出,变成读取存储里的文件数据再转化为内存里的稀疏数组和稀疏矩阵的形式。不做详细介绍了,这里给个将稀疏数组存储到文件中以达到持久化的例子。
记得文件路径改成自己的。

package com.budiu;
/**
结合IO流运用稀疏数组
*/

import java.io.*;

public class SparseArrays_IO {
    public static void main(String[] args) throws IOException {


        int[][] sparseArrays=new int[8][8];
        //假设里面只有三个有效数据
        sparseArrays[2][3]=1;
        sparseArrays[3][4]=2;
        sparseArrays[6][3]=3;
        //二维数组打印遵循先行后列的嵌套循环
            for (int i = 0; i < sparseArrays.length; i++) {//这里的length字段是二维数组的行数
            System.out.printf("[\t");
            for (int j = 0; j < sparseArrays[i].length; j++) {//这里的length字段反映的是二维数组所在行的长度
                System.out.printf("%d\t",sparseArrays[i][j]);
            }
            System.out.println("]");
            System.out.println();
        }
        //        第一步:遍历待压缩数组,提取有效信息。
        int value_sum=0;//有效数据的总数
            for (int i = 0; i < sparseArrays.length; i++) {
            for (int j = 0; j < sparseArrays[i].length; j++) {
                if(sparseArrays[i][j]!=0) {
                    value_sum++;
                }
            }
        }


            System.out.println("将其进行压缩");
        //第二步:创建压缩数组,将值写入
        int[][] compressed_arrays=new int[value_sum+1][3];
        //压缩后的数组首行对应分别是稀疏数组的行,列,有效值总数
        compressed_arrays[0][0]=sparseArrays.length;
        compressed_arrays[0][1]=sparseArrays[0].length;
        compressed_arrays[0][2]=value_sum;
        int count=0;//临时计数器
            for (int i = 0; i < sparseArrays.length; i++) {
            for (int j = 0; j < sparseArrays[i].length; j++) {
                if(sparseArrays[i][j]!=0) {
                    compressed_arrays[count+1][0]=i;
                    compressed_arrays[count+1][1]=j;
                    compressed_arrays[count+1][2]=sparseArrays[i][j];//将具体的有效值插入到压缩中的数组中
                    count++;
                }
            }
        }
        //展示压缩后的数组
            for (int i = 0; i < compressed_arrays.length; i++) {
                System.out.printf("[\t");
                for (int j = 0; j < compressed_arrays[i].length; j++) {
                    System.out.printf("%d\t",compressed_arrays[i][j]);

                }
                System.out.println("]");
            }
        //将压缩数组写入到文件中
        //创建IO流
        File file=new File("D:\\javaworkspace\\note\\data_structure\\src\\file\\map.data");
        FileOutputStream fos=new FileOutputStream(file);
        BufferedOutputStream bos=new BufferedOutputStream(fos);
        for (int i = 0; i < compressed_arrays.length; i++) {
            for (int j = 0; j < compressed_arrays[i].length; j++) {
                bos.write((compressed_arrays[i][j]+"\t").getBytes());

            }
            bos.write("\n".getBytes());
        }
        bos.close();


        //
        FileReader fr=new FileReader(file);
        BufferedReader reader=new BufferedReader(fr);
        int bytesSize=0;
        byte[] bytes=new byte[1024];
        int count1=0;
        String content=null;
        int[][] compressed_arrays1=null;
        while ((content=reader.readLine())!=null){
            //将字节转化为字符

            String[] tmp=content.split("\t");
            int row=Integer.parseInt(tmp[0]);
            int column=Integer.parseInt(tmp[1]);
            int value=Integer.parseInt(tmp[2]);
            count1++;
            if(count1==1){
                compressed_arrays1=new int[value+1][3];
            }
            compressed_arrays1[count1-1][0]=row;
            compressed_arrays1[count1-1][1]=column;
            compressed_arrays1[count1-1][2]=value;


        }
        //恢复压缩数组成正常数组
            System.out.println("恢复成正常数组");
        int[][] normalArrays=new int[compressed_arrays1[0][0]][compressed_arrays1[0][1]];
            for (int i=1;i<compressed_arrays1.length;i++){
            normalArrays[compressed_arrays1[i][0]][compressed_arrays1[i][1]]=compressed_arrays1[i][2];
        }
            for (int i = 0; i < normalArrays.length; i++) {
            System.out.printf("[\t");
            for (int j = 0; j < normalArrays[i].length; j++) {
                System.out.printf("%d\t",normalArrays[i][j]);

            }
            System.out.println("]");
        }
    }
}

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

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

相关文章

2023 年最新 MySQL 数据库 Windows 本地安装、Centos 服务器安装详细教程

MySQL 基本概述 MySQL是一个流行的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;广泛应用于各种业务场景。它是由瑞典MySQL AB公司开发&#xff0c;后来被Sun Microsystems收购&#xff0c;最终被甲骨文公司&#xff08;Oracle Corporation&#xff09;收购…

求二叉树的宽度(可执行)

输入&#xff1a;abd##e##cf### 输出结果&#xff1a;3 运行环境.cpp 注意&#xff1a;若无运行结果&#xff0c;则一定是建树错误 #include "bits/stdc.h" using namespace std; typedef struct BiTNode{char data;struct BiTNode *lchild,*rchild; }BiTNode,*Bi…

day30_servlet

今日内容 零、复习昨日 一、接收请求 二、处理响应 三、综合案例 零、复习昨日 画图, 请求处理的完整流程(javaweb开发流程) 零、注解改造 WebServlet注解,相当于是在web.xml中配置的servlet映射 Servlet类 package com.qf.servlet;import javax.servlet.ServletException; im…

leetcode:914. 卡牌分组(python3解法)

难度&#xff1a;简单 给定一副牌&#xff0c;每张牌上都写着一个整数。 此时&#xff0c;你需要选定一个数字 X&#xff0c;使我们可以将整副牌按下述规则分成 1 组或更多组&#xff1a; 每组都有 X 张牌。组内所有的牌上都写着相同的整数。 仅当你可选的 X > 2 时返回 tru…

作为测试你连K8S都不懂,你还有脸说自己是测试?

kubernetes&#xff0c;简称 K8s&#xff0c;是用 8 代替中间 8 个字符 “ubernete” 而成的缩写&#xff0c;是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xff0c;Kubernetes 的目标是让部署容器化的应用简单并且高效(powerful)&#xff0c;Kuberne…

vue3之echarts区域折线图

vue3之echarts区域折线图 效果&#xff1a; 核心代码&#xff1a; <template><div class"abnormal"><div class"per">单位&#xff1a;{{ obj.data?.unit }}</div><div class"chart" ref"chartsRef"&g…

如何在Linux以docker-compose方式快速部署运行StackEdit,并实现公网访问

文章目录 1. docker部署Stackedit2. 本地访问3. Linux 安装cpolar4. 配置Stackedit公网访问地址5. 公网远程访问Stackedit6. 固定Stackedit公网地址 StackEdit是一个受欢迎的Markdown编辑器&#xff0c;在GitHub上拥有20.7k Star&#xff01;&#xff0c;它支持将Markdown笔记保…

井下特种兵——智能管网监测终端

深入井下&#xff0c;守护每一滴水的智慧——井下特种兵&#xff0c;智能管网监测终端 你是否曾为地下管网的监测和维护感到困扰&#xff1f;现在&#xff0c;我们向你介绍一款强大的井下特种兵——智能管网监测终端。这是一款专门为解决地下管网监测难题而设计的智能设备&…

单/三相dq解耦控制与特定次谐波抑制

1. 单相整流器dq坐标系下建模 单相整流器的拓扑如图所示&#xff0c;可知 u a b u s − L d i s d t − R i s {u_{ab}} {u_{s}} - L\frac{{d{i_s}}}{{dt}} - R{i_s} uab​us​−Ldtdis​​−Ris​。   将电压和电流写成dq的形式。 { u s U s m sin ⁡ ( ω t ) i s I …

FPGA_探针(ISSP)调试工具

探针则是将 FPGA 内部的节点信号通过 JTAG 电缆传输到 PC 机上&#xff0c;方便用户观察。对于一些变化比较缓慢或者实时性要求不高的信号&#xff0c;使用该工具调试非常的方便&#xff0c;例如观察 ADC 的采样结果。 为了更便捷地进行板级调试&#xff0c;这里介绍 Qusrtus …

前端本地存储数据库IndexedDB

前端本地存储数据库IndexedDB 1、前言2、什么是 indexedDB&#xff1f;3、什么是 localForage&#xff1f;4、localForage 的使用5、VUE 推荐使用 Pinia 管理 localForage 1、前言 前端本地化存储算是一个老生常谈的话题了&#xff0c;我们对于 cookies、Web Storage&#xff…

键盘控制ROS车运动

键盘控制ROS车运动 上位机 使用pyseria库与stm32单片机进行通信控制 #!/usr/bin/env python # -*- coding: utf-8 -*import sys, select, termios, tty import serialmsg """ ---------------------------w a x ds w : x a : y s : -x …

NX二次开发UF_CAM_ask_cam_preferences 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;里海NX二次开发3000例专栏 UF_CAM_ask_cam_preferences Defined in: uf_cam.h int UF_CAM_ask_cam_preferences(UF_CAM_preferences_p_t prefs ) overview 概述 This function provides the current settings of the CAM pre…

2024一定要看的文章系列!!!接口自动化测试框架思路和实战(5):【推荐】混合测试自动化框架(关键字+数据驱动)

混合测试自动化框架(关键字数据驱动) 关键字驱动或表驱动的测试框架 这个框架需要开发数据表和关键字。这些数据表和关键字独立于执行它们的测试自动化工具&#xff0c;并可以用来“驱动&#xff02;待测应用程序和数据的测试脚本代码&#xff0c;关键字驱动测试看上去与手工测…

Leetcode 153. 寻找旋转排序数组中的最小值

class Solution {//因为最小值和最大值总是相邻的&#xff08;除了初始状态&#xff09;//1.用二分查找&#xff0c;如果右侧是有序则最小值在左侧//2.如果右侧无序则最小值在右侧//如果mid正好是最小值&#xff0c;那么右侧自然是有序的&#xff0c;//为了将mid加入到搜索的一…

如何用内容营销推动企业成长?媒介盒子教你三步实现

信息时代下每个人都能通过网络了解自己所需的信息&#xff0c;企业与受众的接触也更加直接&#xff0c;企业在获得更多消费者触达通道的同时&#xff0c;消费者也在经历信息爆炸和碎片化&#xff0c;如何在大量信息中脱颖而出&#xff0c;抓住消费者心智&#xff0c;成为许多品…

外卖小程序系统:数字化餐饮的编码之道

在当今数字化时代&#xff0c;外卖小程序系统成为了餐饮业的一项技术巨制。这个系统不仅提供了便捷的点餐体验&#xff0c;更通过先进的技术手段&#xff0c;实现了高效订单处理、实时配送追踪以及个性化推荐。让我们深入了解外卖小程序系统的技术魔法&#xff0c;一起揭秘数字…

API接口接入1688电商数据平台获取商品详情数据示例

1688电商数据平台是一个提供海量商品信息的数据平台&#xff0c;通过API接口可以方便地获取商品详情数据。以下是一个示例&#xff0c;演示如何接入1688电商数据平台&#xff0c;获取商品详情数据。 步骤一&#xff1a;注册1688账号并获取API权限 首先需要在1688电商数据平台…

ArkTS编程语法基础,让你成为HarmonyOS开发高手

文章目录 ArkTS简介ArkUI开发框架的整体架构ArkTS的基础类型条件语句函数类模块函数定义函数的参数箭头函数 迭代器后续学习资源介绍 ArkTS简介 ArkTS是HarmonyOS主力应用开发语言。它在TypeScript (简称TS)的基础上&#xff0c;匹配ArkUI框架&#xff0c;扩展了声明式UI、状态…