Java的稀疏数组的简单代码实现
Java的稀疏数组的简单代码实现
一、稀疏数组的基本概念
当二维数组的很多值是默认值 0,或者有很多相同的值时,记录了很多没有意义的数据,因此,在这里,我们需要引入一个新的概念——稀疏数组
在稀疏数组中,每行分别有三个元素:行,列,值。在稀疏数组的第一行,行表示原数组的行数,列表示原数组的列数,值表示原数组非0数据的个数;接下来的稀疏数组的几行中,行表示非0数据所在原数组的行数,列表示非0数据所在原数组的列数,而值则代表此非0数据的值。
如下面这个数组:
0 0 0 2 0
0 0 0 0 0
0 0 0 0 0
0 1 0 0 0
0 0 0 0 0
用稀疏数组表示为:
5 5 2 (表示原始数组有4行7列,有2个非0的值)
0 3 2 (表示在原始数组的下标为0的行、下标为3的列上有值为2,即在原始数组的1行4列上是2)
3 1 1 (表示在原始数组的下标为3的行、下标为1的列上有值为1,即在原始数组的4行2列上是1)
与原数组相比,稀疏数组变小了很多,原始数组有25个元素,而用稀疏数组表示则只有9个元素。
二、稀疏数组的Java代码实现思路
- 求出原始数组中非0的值的个数
- 创建二维数组,稀疏数组的第一行分别为原始数组的行数、列数、非0值的个数
- 利用for循环找出原始数组中非0值以及非0值的行标和列标,从稀疏数组第二行开始就是原始数组的非0值的坐标,第一列是非0值在原始数组中的下标行数,第二列就是非0值在原始数组中的下标列数,第三列就是非0值
三、稀释数组的Java代码实现
package array;
/*
实现java的稀疏数组
*/
public class arrayDemo_01 {
/*
原数组 5*5 有效值 2
0 0 0 2 0
0 0 0 0 0
0 0 0 0 0
0 1 0 0 0
0 0 0 0 0
可以看出原数组中除了2个值外,其他的都是0
稀疏数组
5 5 2
0 3 2
3 1 1
*/
//因为代码中多次出现for循环,所以定义遍历traversal方法
public static int traversal(int[][] array) {
int sum = 0;
for (int[] ints : array) {
for (int anInt : ints) {
System.out.print(anInt + "\t"); //打印数组
if (anInt != 0) {
sum++; //获取非零值的个数
}
}
System.out.println();
}
return sum;
}
public static void main(String[] args) {
//原始数组
int[][] array1 = new int[5][5];
array1[0][3] = 2;
array1[3][1] = 1;
//输出原始数组
System.out.println("\t\t\t原始数组");
//获取有效值的个数,同时输出原始数组
int sum = traversal(array1);
System.out.println();
System.out.println("==================================");
System.out.println();
//转化为稀疏数组保存
//创建一个稀疏数组的数组
int[][] array2 = new int[sum + 1][3];
array2[0][0] = 5;
array2[0][1] = 5;
array2[0][2] = 2;
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("有效值:" + count);
//输出稀疏数组
System.out.println(" 稀疏数组");
for (int[] ints : array2) {
System.out.println(ints[0] + "\t"
+ ints[1] + "\t"
+ ints[2] + "\t");
}
System.out.println("====================");
System.out.println("还原");
//读取稀疏数组,创建数组
int[][] array3 = new int[array2[0][0]][array2[0][1]];
//还原其他的值
for (int i = 1; i < array2.length; i++) {
array3[array2[i][0]][array2[i][1]] = array2[i][2];
}
//打印还原后的数组
System.out.println("\t\t 还原后的数组");
traversal(array3);
}
}
四、结语
在运用稀疏数组时,不一定要是0值,其他值占大多数时也可以用稀疏数组。
本文是本人在学习过程中的笔记分享,欢迎大家指正批评,同时也希望能够帮助到需要的人!
Java的稀疏数组的简单代码实现的更多相关文章
- java算法--稀疏数组
数据结构必要知识 线性结构 线性结构是最常用的数据结构,数据元素之间存在一对一的线性关系. 线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构.顺序存储的线性表称为顺序表,顺序表中的存储元素是 ...
- Java学习之数组的简单用法
•概念 其实所谓的数组指的就是一组相关类型的变量集合,并且这些变量可以按照统一的方式进行操作. 数组本身属于引用数据类型,那么既然是引用数据类型,这里面实际又会牵扯到内存分配: 而数组的定义语法有两种 ...
- java实现稀疏数组压缩
package sparseArray; public class SparseArray { public static void main(String[] args) { // TODO Aut ...
- [JAVA] Tcp客户端和服务器简单代码
服务器: import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; im ...
- java中二维数组求最大值代码。。。。。。不懂呀
总结:二维数组理解不了,,,,求解析... package com.c2; public class Aaa { // 求数组元素中最大的 public static void main(String ...
- 理解JS里的稀疏数组与密集数组
一般来说,JavaScript中的数组是稀疏的. 什么是稀疏呢?稀疏也就是说,数组中的元素之间可以有空隙,因为一个数组其实就是一个键值映射.本文解释了如何创建稀疏数组和不稀疏的数组. 1.稀疏数组 创 ...
- javascript中的稀疏数组(sparse array)和密集数组
学习underscore.js数组相关API的时候.遇到了sparse array这个东西,曾经没有接触过. 这里学习下什么是稀疏数组和密集数组. 什么是密集数组呢?在java和C语言中,数组是一片连 ...
- 数据结构与算法之java语言实现(一):稀疏数组
一.概念&引入 什么是稀疏数组? 稀疏数组是面对一个二维数组中有众多重复元素的情况下,为了节省磁盘空间,将此二维数组转化为更加节省空间的一种数组,我们叫他稀疏数组. 只是听概念或许会看不明白, ...
- 图解Java数据结构之稀疏数组
在编程中,算法的重要性不言而喻,没有算法的程序是没有灵魂的.可见算法的重要性. 然而,在学习算法之前我们需要掌握数据结构,数据结构是算法的基础. 我在大学的时候,学校里的数据结构是用C语言教的,因为对 ...
随机推荐
- Java中把对象、对象bean、list集合、对象数组、Map和Set以及字符串转换成Json
对象转换为Json 对象bean转换为Json List集合转换为Json 对象数组转换为Json Map集合转换为Json Set集合转为Json 字符串转换为Json 把Java对常用的一些数据转 ...
- Spring MVC—数据绑定机制,数据转换,数据格式化配置,数据校验
Spring MVC数据绑定机制 数据转换 Spring MVC处理JSON 数据格式化配置使用 数据校验 数据校验 Spring MVC数据绑定机制 Spring MVC解析JSON格式的数据: 步 ...
- Phoenix简介概述,Phoenix的Java API 相关操作优秀案例
Phoenix简介概述,Phoenix的Java API 相关操作优秀案例 一.Phoenix概述简介 二.Phoenix实例一:Java API操作 2.1 phoenix.properties 2 ...
- ICMP&&PING
ICMP 1.定位:互联网控制报文协议(Internet Control Message Protocol),是TCP/IP协议族的一个子协议,位于网络层.它被IP用于提供许多不同的服务.ICMP是一 ...
- 数理统计4:均匀分布的参数估计,次序统计量的分布,Beta分布
接下来我们就对除了正态分布以外的常用参数分布族进行参数估计,具体对连续型分布有指数分布.均匀分布,对离散型分布有二项分布.泊松分布几何分布. 今天的主要内容是均匀分布的参数估计,内容比较简单,读者应尝 ...
- 故障-因为MAC地址冲突造成的故障
1.问题分析与解决 1.1 症状与起因 问题症状: 访问卡慢,负载并不高 起因: 笔者有一部分物理机做了虚拟化,由于体量小就直接通过命令行工具创建,在创建时并没有通过kvm的clone命令,而是手工修 ...
- HTTP的传输编码(Transfer-Encoding:chunked) / net::ERR_INVALID_CHUNKED_ENCODING
https://blog.csdn.net/m0_37668842/article/details/89138733 https://www.cnblogs.com/jamesvoid/p/11297 ...
- HTTP笔记1--Web及网络基础
web页面如何呈现? 客户端:通过发送请求获取服务器资源的 Web 浏览器 web是建立在 HTTP 协议上通信的 WWW(万维网/web)的构建技术 把 SGML(StandardGeneral ...
- flagcounter 被禁用...
源地址 https://s11.flagcounter.com/count2/arWz/bg_FFFFFF/txt_000000/border_CCCCCC/columns_2/maxflags_14 ...
- Leetcode(53)-最大子序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 ...