数据结构与算法:稀疏数组Java版

news2024/11/30 2:43:09

什么是稀疏数组

稀疏数组是一种特殊的数据结构,它仅在数组中保存了有效的数据元素,忽略掉了大部分未被使用或被零值占据的元素,从而节省了内存空间

在稀疏数组中,只有非零元素会被保存,这些元素在原数组中的位置和值保持不变。稀疏数组通常用于存储大规模但只有少量非零元素的数据集,例如稀疏矩阵等。

总结一下:

  1. 是一种特殊的数据结构
  2. 只保存有效的数据元素
  3. 节省了内存空间

代码说明

  1. 将普通的二维数组压缩成为稀疏数组
  2. 将稀疏数组再转换为普通的二维数组
  3. 将稀疏数组通过IO流存入到文件中
  4. 从文件中读取到稀疏数组
package com.haimeng.sparsearray;

import java.io.*;

public class SparseArray {

    public static void main(String[] args) throws Exception {
        // 创建一个原始的二维数组 	11*11
        // 0:表示没有棋子,1:表示黑子,2:表示白子

        int chessArr1[][] = new int[11][11];
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;

        //输出原始的二维数组
        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 sparseArrp[][] = new int[sum + 1][3];
        //给稀疏数组赋值
        sparseArrp[0][0] = 11;
        sparseArrp[0][1] = 11;
        sparseArrp[0][2] = sum;

        //遍历二维数组,将非0的值存放到sparseArrp中
        int count = 0; //count 用于计算是第几个非0数据
        for(int i = 0; i < 11; i++) {
            for(int j = 0; j < 11; j++) {
                if (chessArr1[i][j] != 0) {
                    count++;
                    sparseArrp[count][0] = i;
                    sparseArrp[count][1] = j;
                    sparseArrp[count][2] = chessArr1[i][j];
                }
            }
        }

        //输出稀疏数组的形式
        System.out.println();
        System.out.println("得到稀疏数组为:");
        for(int i = 0; i <sparseArrp.length; i++) {
            System.out.printf("%d\t%d\t%d\t\n",sparseArrp[i][0],sparseArrp[i][1],sparseArrp[i][2]);
        }
        System.out.println();

        //将稀疏数组---》恢复成原始的二维数组
		/*
		 * 1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的  chessArr2 = int [11][11]
		   2. 在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可.
		 */

        //1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
        int chessArr2[][] = new int[sparseArrp[0][0]][sparseArrp[0][1]];


        //2. 在读取稀疏数组后几行的数据(从第二行开始),并赋给 原始的二维数组 即可.
        for(int i = 1;i<sparseArrp.length;i++) {
            chessArr2[sparseArrp[i][0]][sparseArrp[i][1]] = sparseArrp[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();
        }



        //--------------------------------------------------------------
        //将稀疏数组 sparseArrp 存入到文件中去

        //覆盖管道
        Writer fw = new FileWriter("src/com/haimeng/sparsearray/test.txt");
        BufferedWriter bw = new BufferedWriter(fw);

        for (int[] row : sparseArrp) {
            for (int num : row) {
                bw.write(num + " ");
            }
            bw.newLine();
        }
        bw.close();


        //将文件中的稀疏数组读取出来,并打印到控制台
        Reader fr = new FileReader("src/com/haimeng/sparsearray/test.txt");
        BufferedReader br = new BufferedReader(fr);

        String line;
        int row = 0;    //用来表示行数
        int[][] array = new int[3][3]; //用来保存从文件中读取出来的稀疏数组
        while ((line = br.readLine()) != null){

            String[] numbers = line.split(" ");
            for (int i = 0; i < numbers.length; i++) {
                array[row][i] = Integer.parseInt(numbers[i]);
            }
            row++;
        }

        //遍历稀疏数组---array
        System.out.println("从文件中读取出来的稀疏数组是:");
        for(int[] row2 : array) {
            for(int data : row2) {
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }

    }

}

运行结果

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

姿态识别+康复训练矫正+代码+部署(AI 健身教练来分析深蹲等姿态)

姿态识别康复训练矫正&#xff08;AI 健身教练姿态分析&#xff09; 目录 本文旨在构建一个 AI 健身教练&#xff0c;帮助判断姿态标准与否&#xff0c;并且矫正姿态&#xff01;无论您是初学者还是专业人士&#xff0c;它都可以帮助您无缝地进行深蹲。为了完成这项任务&…

基于海洋捕食者算法的无人机航迹规划-附代码

基于海洋捕食者算法的无人机航迹规划 文章目录 基于海洋捕食者算法的无人机航迹规划1.海洋捕食者搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用海洋捕食者算法来优化无人机航迹…

SANSAN每周新鲜事|到底哪一款物联网平台适合你?

假如您有对设备进行监控、控制、管理、维护的需求&#xff0c;或者您的业务系统涉及设备管控、设备数据可视化和分析&#xff0c;大概率上&#xff0c;您需要开发一套系统专门去做设备接入和管理&#xff0c;您会面临两种选择&#xff1a; 1、选择一款合适的物联网平台&#x…

“消费增值:绿色商业模式的创新之路“

随着消费者对绿色、环保生活方式的追求不断增加&#xff0c;一种名为消费增值的商业模式正逐渐受到人们的关注。通过鼓励绿色消费行为&#xff0c;消费增值模式引导消费者形成低碳环保的生活方式&#xff0c;并实现积分的增值和社会效益的提升。一种只涨不跌的模式&#xff0c;…

历年网规上午真题笔记(2015年)

解析: 变更控制为“问题识别”——“问题分析与变更描述”——“变更分析与成本计算”——“变更实现”——“修改后的需求” 自动化工具能够帮助变更控制过程更有效地运作,能有效收集、存储、管理变更,工具应该具备的特征如下: 可定义变更请求中的数据可定义变更请求生命…

以八数码问题为例实现A*算法的求解(未完结)

八数码&#xff1a; 在一个 33 的网格中&#xff0c;1∼8 这 8 个数字和一个 x 恰好不重不漏地分布在这 33 的网格中。 例如&#xff1a; 1 2 3 x 4 6 7 5 8在游戏过程中&#xff0c;可以把 x 与其上、下、左、右四个方向之一的数字交换&#xff08;如果存在&#xff09;。…

SQL server数据库端口访问法

最近数据库连接&#xff0c;也是无意中发现了这个问题&#xff0c;数据库可根据端口来连接 网址:yii666.com< 我用的是sql2014测试的&#xff0c;在安装其他程序是默认安装了sql(sql的tcp/ip端口为xxx)&#xff0c;服务也不相同&#xff0c;但是由于比较不全&#xff0c;我…

yum工具(介绍+常用指令)

目录 yum--软件包管理器 概念 引入 rpm安装 yum安装 指令 yum list yum install 包名 yum remove 包名 yum search 包名/关键字 yum update/upgrade yum makecache fast du命令 yum--软件包管理器 概念 引入 在linux中下载软件,可以下载源代码进行编译执行但是…

使用Ansible中的playbook

目录 1.Playbook的功能 2.YAML 3.YAML列表 4.YAML的字典 5.playbook执行命令 6.playbook的核心组件 7.vim 设定技巧 示例 1.Playbook的功能 playbook 是由一个或多个play组成的列表 Playboot 文件使用YAML来写的 2.YAML #简介# 是一种表达资料序列的格式,类似XML #特…

GB28181学习(十四)——语音广播与语音对讲

语音对讲 定义 用户端向设备通过视音频点播请求音频数据&#xff1b;用户端接收音频数据并通过特定的播放设备&#xff08;如音响&#xff09;播放&#xff1b;用户端向设备发送广播请求&#xff1b;设备解析广播成功后通过INVITE方法向用户请求音频数据&#xff1b;用户通过音…

大长案例 - 经典长连接可水平扩容高可用架构

文章目录 需求设计 需求 支撑百万充电桩充电业务的长连接可水平扩容高可用架构需求如下&#xff1a; 可扩展性&#xff1a;系统应该具备高度可扩展性&#xff0c;能够轻松应对新增充电桩的需求。任何时候都应该容易添加更多的充电桩&#xff0c;而不会影响整体性能。 负载均衡…

Linux C语言进阶-D7~D8指针与数组

一维数组 一维数组的数组名&#xff1a;就是一维数组的指针&#xff08;起始地址&#xff09; 如果int *px x;则&#xff1a; x[i]、*(pxi)、*(xi)、px[i]具有完全相同的功能&#xff1a;访问数组第i1个数组元素 注意&#xff1a;1、指针变量和数组在访问数组元素时&#x…

筛网孔径测量方法,您了解多少?

筛网是一种表面有均匀而稳定的透气孔、具有筛选和过滤作用的工业用品&#xff0c;常见的有金属丝编织网和冲孔板筛网&#xff0c;广泛用于新能源汽车、太阳能光伏、冶金、煤炭、橡胶、石油、化工、制药、建材、粮油等行业。 筛网有着严格的网孔尺寸规范&#xff0c;需要符合标…

141. 环形链表、Leetcode的Python实现

博客主页&#xff1a;&#x1f3c6;看看是李XX还是李歘歘 &#x1f3c6; &#x1f33a;每天分享一些包括但不限于计算机基础、算法等相关的知识点&#x1f33a; &#x1f497;点关注不迷路&#xff0c;总有一些&#x1f4d6;知识点&#x1f4d6;是你想要的&#x1f497; ⛽️今…

安装opensips

1. 安装opensips ubuntu下安装&#xff1a; 1&#xff09;执行以下的脚本 openSIPS | APT Repository 2&#xff09;apt-get install opensips 安装完毕后&#xff0c;再选择需要的module继续安装&#xff0c;不需要编译 如果只是用作load balancer&#xff0c;那么只需要…

剑指JUC原理-8.Java内存模型

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&…

Windows安装tensorflow-gpu=1.14.0CUDA=10.0cuDNN=7.4 (多版本CUDA共存)

文章目录 0. 前置说明1. 查看版本对应关系2. 安装 cuda3. 安装 cudnn4. 添加环境变量5. 安装 tensorflow 0. 前置说明 本机&#xff08;Windows 11&#xff09;已安装CUDA 11.7 使用命令查看显卡驱动&#xff1a; nvidia-smi这里显示的CUDA Version: 11.7说明支持安装11.7版本…

小说网站源码带管理后台手机端和采集

搭建教程&#xff0c;安装宝塔 php7.2&#xff0c;绑定域名&#xff0c;上传源码到根目录解压 源码获取请自行百度&#xff1a;一生相随博客 一生相随博客致力于分享全网优质资源&#xff0c;包括网站源码、游戏源码、主题模板、插件、电脑软件、手机软件、技术教程等等&#…

2.Docker的安装

1.认识Docker的基本架构 下面这张图是docker官网上的&#xff0c;介绍了整个Docker的基础架构&#xff0c;我们根据这张图来学习一下docker的涉及到的一些相关概念。 1.1 Docker的架构组成 Docker架构是由Client(客户端)、Docker Host(服务端)、Registry(远程仓库)组成。 …

每天一道算法题:11. 盛最多水的容器

难度 中等 题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 **说明&#xff1a;**你不…