使用Java对稀疏数组的压缩与还原
稀疏矩阵的压缩与还原
稀疏数组中元素个数很少或者有大量的重复值,如果直接保存保存,会浪费很多空间,这时,就可以考虑对数组进行压缩存储。
先定义一个稀疏数组
//创建一个二维数组 11 * 11
int[][] array1 = new int[11][11];
//给一些元素赋值
array1[1][2] = 1;
array1[2][3] = 2;
array1[4][4] = 1;
array1[8][5] = 2;
打印初始数组
//输出原始数组
System.out.println("输出原始数组");
for (int[] arr : array1) {
System.out.println(Arrays.toString(arr));
}

压缩稀疏数组
在压缩数组时,我们可以用稀疏数组的第一行来存储元素数组的大小及原始数组的有效个数。下表为稀疏数组存储的内容,第一行为原始数组的行、列、元素个数。其余行为有效值信息,包括行坐标、列坐标以及有效值。
| 0 | 1 | 2 | |
|---|---|---|---|
| 0 | 原始数组行数 | 原始数组列数 | 有效值个数 |
| 1 | 行坐标 | 列坐标 | 有效值 |
| 2 | 行坐标 | 列坐标 | 有效值 |
| ...... | 行坐标 | 列坐标 | 有效值 |
通过原始数组获取有效值个数
//获取有效值个数
int sum = 0;
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
if (array1[i][j] != 0)
sum++;
}
}
System.out.println("有效个数为:" + sum);

根据有效值的个数创建稀疏数组,稀疏数组的行数为有效值个数加1,列数固定为3.
int[][] array2 = new int[sum + 1][3];
array2[0][0] = 11;//原始数组行数
array2[0][1] = 11;//原始数组列数
array2[0][2] = sum;//有效值个数
接下来就可以保存原始数组的有效值信息了。先利用一个计数器记录有效值个数。
//遍历二维数组,将非零的值,存放稀疏数组中
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];//有效值
}
}
}
输出稀疏矩阵
for (int i = 0; i < array2.length; i++) {
System.out.println(array2[i][0] + "\t" + array2[i][1] + "\t" + array2[i][2]);
}

通过稀疏数组还原原始数组
由于稀疏数组的第一行是保存的元素数组的大小,因此我们可以用其来创建一个元素数组的大小。
int[][] array3 = new int[array2[0][0]][array2[0][1]];//array2[0][0]存储的为原始数组的行数,array2[0][1]存储的为原始数组的列数
从稀疏数组下标为1开始遍历,因为1开始才是有效值的信息。如array2[1][0]就是第一个有效值的行坐标,array2[1][1]就是第一个有效值的列坐标,array2[1][2]就是第一个有效值。
for (int i = 1; i < array2.length; i++) {
array3[array2[i][0]][array2[i][1]] = array2[i][2];
}
最后输出还原后的数组。
//输出还原数组
System.out.println("输出还原数组");
for (int[] arr : array3) {
System.out.println(Arrays.toString(arr));
}

完整代码
package com.jiang.array;
import java.util.Arrays;
/**
* @author HaiJaine
**/
public class ArrayDemo08 {
public static void main(String[] args) {
//创建一个二维数组 11 * 11
int[][] array1 = new int[11][11];
//给一些元素赋值
array1[1][2] = 1;
array1[2][3] = 2;
array1[4][4] = 1;
array1[8][5] = 2;
//输出原始数组
System.out.println("输出原始数组");
for (int[] arr : array1) {
System.out.println(Arrays.toString(arr));
}
System.out.println("=================================");
//转换为稀疏数组保存
//获取有效值个数
int sum = 0;
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
if (array1[i][j] != 0)
sum++;
}
}
System.out.println("有效个数为:" + sum);
//创建一个稀疏数组,第一个行为原始数组的行、列、有效值个数,其余行分别保存元素所在的行、列、元素值
int[][] array2 = new int[sum + 1][3];
array2[0][0] = 11;//原始数组行数
array2[0][1] = 11;//原始数组列数
array2[0][2] = sum;//有效值个数
//遍历二维数组,将非零的值,存放稀疏数组中
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]);
}
System.out.println("=================================");
System.out.println("稀疏矩阵还原");
//1、读取稀疏数组
int[][] array3 = new int[array2[0][0]][array2[0][1]];//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];
}
//输出还原数组
System.out.println("输出还原数组");
for (int[] arr : array3) {
System.out.println(Arrays.toString(arr));
}
}
}
使用Java对稀疏数组的压缩与还原的更多相关文章
- Java的稀疏数组的简单代码实现
目录 Java的稀疏数组的简单代码实现 一.稀疏数组的基本概念 二.稀疏数组的Java代码实现思路 三.稀释数组的Java代码实现 四.结语 Java的稀疏数组的简单代码实现 一.稀疏数组的基本概念 ...
- java实现稀疏数组压缩
package sparseArray; public class SparseArray { public static void main(String[] args) { // TODO Aut ...
- java算法--稀疏数组
数据结构必要知识 线性结构 线性结构是最常用的数据结构,数据元素之间存在一对一的线性关系. 线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构.顺序存储的线性表称为顺序表,顺序表中的存储元素是 ...
- 图解Java数据结构之稀疏数组
在编程中,算法的重要性不言而喻,没有算法的程序是没有灵魂的.可见算法的重要性. 然而,在学习算法之前我们需要掌握数据结构,数据结构是算法的基础. 我在大学的时候,学校里的数据结构是用C语言教的,因为对 ...
- Java.稀疏数组
package array; public class demo06 { public static void main(String[] args) { //创建一个二维数组 11*11 int[] ...
- java数组---稀疏数组与数组之间的相互转化
public static void main(String[] args) { int[][]array1=new int[11][11]; array1[1][2]=1; array1[2][3] ...
- Java方法和数组
方法 什么是方法 Java方法是语句的集合,它们在一起执行一个功能. 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 设计方法的原则:方法的本意是功能块 ...
- golang数据结构之稀疏数组
掌握知识: 数组的初始化和赋值 结构体的初始化和赋值 字符串和整型之间的转换以及其它的一些操作 类型断言 读取文件 写入文件 对稀疏数组进行压缩 package main import ( " ...
- 数据结构(1):稀疏数组使用java实现
主要是用于数组压缩,去除无效的数组内容: 原数组内容: 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 转换成 稀疏数组 5 5 2 1 1 1 2 ...
- 数据结构与算法之java语言实现(一):稀疏数组
一.概念&引入 什么是稀疏数组? 稀疏数组是面对一个二维数组中有众多重复元素的情况下,为了节省磁盘空间,将此二维数组转化为更加节省空间的一种数组,我们叫他稀疏数组. 只是听概念或许会看不明白, ...
随机推荐
- java中SimpleDateFormat解析日期格式的问题
在日常写代码的过程中,我们经常要处理各种格式的日期,常见的日期格式有:"20240601","2024-06-01","2024-6-1". ...
- 2023CSP-S游记
2023 CSP-S 游记 赛前 上午去花卉市场看了半天花,算是放松放松,主要是为了晚上给干妈过50岁生日. 还以为是 2 点开始,1 点 40 多就到了,然后去买了杯奶茶,然后进场. 结果我是第一考 ...
- liquibase常用操作
1.概述 Liquibase是一个用于跟踪.管理和应用数据库变化的开源的数据库重构工具.它将所有数据库的变化(包括结构和数据)都保存在XML文件中,便于版本控制. 本文旨在将平时工作中常用的一些操作进 ...
- 喜讯!极限科技再次中标中国移动云 Elasticsearch 自研版技术开发服务项目!
喜讯!极限科技 再次中标 中国移动云 Elasticsearch 自研版技术开发服务项目! 近日,极限科技再次成功中标中国移动苏州研发中心 <云能力中心 2023-2024 年移动云 Elast ...
- Javascript高级程序设计第五章 | ch5 | 阅读笔记
基本引用类型 Date 在不给定时间的情况下创建Date实例,创建的对象将保存当前的日期和时间. 要基于其他时间创建Date对象,必须传入其毫秒时表示 Date.parse() 月/日/年(5/21/ ...
- Linux chmod -bash: ./xx.sh: Permission denied的解决方案
Linux -bash: ./xx.sh: Permission denied的解决方案启动tomcat命令:./startup.sh之后提示-bash: ./startup.sh: Permissi ...
- 【踩坑】.NET 8.0 自定义IExceptionHandler不生效
中间件实现异常处理 在ASP.NET Core里,我们可以使用中间件(Middleware)实现全局的异常处理. 如内置的异常处理中间件 UseExceptionHandler app.UseExce ...
- 状态模式(Sate Pattern)
一.模式动机 状态模式(State Pattern)是一种较为复杂的行为型模式.它用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题.当系统中某个对象存在多个状态,这些状态之间可以进行转换, ...
- recastnavigation.Sample_TempObstacles代码注解 - rcBuildHeightfieldLayers
烘培代码在 rcBuildHeightfieldLayers 本质上是为每个tile生成高度上的不同layer 算法的关键是三层循环: for z 轴循环 for x 轴循环 for 高度span 循 ...
- Jemter代理服务器录制脚本,优化后形成性能测试场景
在进行性能测试(压力.负载)等,先要有对应的测试场景,比如添加功能:要先登录成功,然后调用添加接口,输入添加的内容,才可以添加成功.那么可以通过Jemter代理服务器,设置代理,打开测试的网站,录制脚 ...