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代码实现思路

  1. 求出原始数组中非0的值的个数
  2. 创建二维数组,稀疏数组的第一行分别为原始数组的行数、列数、非0值的个数
  3. 利用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的稀疏数组的简单代码实现的更多相关文章

  1. java算法--稀疏数组

    数据结构必要知识 线性结构 线性结构是最常用的数据结构,数据元素之间存在一对一的线性关系. 线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构.顺序存储的线性表称为顺序表,顺序表中的存储元素是 ...

  2. Java学习之数组的简单用法

    •概念 其实所谓的数组指的就是一组相关类型的变量集合,并且这些变量可以按照统一的方式进行操作. 数组本身属于引用数据类型,那么既然是引用数据类型,这里面实际又会牵扯到内存分配: 而数组的定义语法有两种 ...

  3. java实现稀疏数组压缩

    package sparseArray; public class SparseArray { public static void main(String[] args) { // TODO Aut ...

  4. [JAVA] Tcp客户端和服务器简单代码

    服务器: import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; im ...

  5. java中二维数组求最大值代码。。。。。。不懂呀

    总结:二维数组理解不了,,,,求解析... package com.c2; public class Aaa { // 求数组元素中最大的 public static void main(String ...

  6. 理解JS里的稀疏数组与密集数组

    一般来说,JavaScript中的数组是稀疏的. 什么是稀疏呢?稀疏也就是说,数组中的元素之间可以有空隙,因为一个数组其实就是一个键值映射.本文解释了如何创建稀疏数组和不稀疏的数组. 1.稀疏数组 创 ...

  7. javascript中的稀疏数组(sparse array)和密集数组

    学习underscore.js数组相关API的时候.遇到了sparse array这个东西,曾经没有接触过. 这里学习下什么是稀疏数组和密集数组. 什么是密集数组呢?在java和C语言中,数组是一片连 ...

  8. 数据结构与算法之java语言实现(一):稀疏数组

    一.概念&引入 什么是稀疏数组? 稀疏数组是面对一个二维数组中有众多重复元素的情况下,为了节省磁盘空间,将此二维数组转化为更加节省空间的一种数组,我们叫他稀疏数组. 只是听概念或许会看不明白, ...

  9. 图解Java数据结构之稀疏数组

    在编程中,算法的重要性不言而喻,没有算法的程序是没有灵魂的.可见算法的重要性. 然而,在学习算法之前我们需要掌握数据结构,数据结构是算法的基础. 我在大学的时候,学校里的数据结构是用C语言教的,因为对 ...

随机推荐

  1. Java中把对象、对象bean、list集合、对象数组、Map和Set以及字符串转换成Json

    对象转换为Json 对象bean转换为Json List集合转换为Json 对象数组转换为Json Map集合转换为Json Set集合转为Json 字符串转换为Json 把Java对常用的一些数据转 ...

  2. Spring MVC—数据绑定机制,数据转换,数据格式化配置,数据校验

    Spring MVC数据绑定机制 数据转换 Spring MVC处理JSON 数据格式化配置使用 数据校验 数据校验 Spring MVC数据绑定机制 Spring MVC解析JSON格式的数据: 步 ...

  3. Phoenix简介概述,Phoenix的Java API 相关操作优秀案例

    Phoenix简介概述,Phoenix的Java API 相关操作优秀案例 一.Phoenix概述简介 二.Phoenix实例一:Java API操作 2.1 phoenix.properties 2 ...

  4. ICMP&&PING

    ICMP 1.定位:互联网控制报文协议(Internet Control Message Protocol),是TCP/IP协议族的一个子协议,位于网络层.它被IP用于提供许多不同的服务.ICMP是一 ...

  5. 数理统计4:均匀分布的参数估计,次序统计量的分布,Beta分布

    接下来我们就对除了正态分布以外的常用参数分布族进行参数估计,具体对连续型分布有指数分布.均匀分布,对离散型分布有二项分布.泊松分布几何分布. 今天的主要内容是均匀分布的参数估计,内容比较简单,读者应尝 ...

  6. 故障-因为MAC地址冲突造成的故障

    1.问题分析与解决 1.1 症状与起因 问题症状: 访问卡慢,负载并不高 起因: 笔者有一部分物理机做了虚拟化,由于体量小就直接通过命令行工具创建,在创建时并没有通过kvm的clone命令,而是手工修 ...

  7. 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 ...

  8. HTTP笔记1--Web及网络基础

    web页面如何呈现? 客户端:通过发送请求获取服务器资源的 Web 浏览器 web是建立在 HTTP 协议上通信的   WWW(万维网/web)的构建技术 把 SGML(StandardGeneral ...

  9. flagcounter 被禁用...

    源地址 https://s11.flagcounter.com/count2/arWz/bg_FFFFFF/txt_000000/border_CCCCCC/columns_2/maxflags_14 ...

  10. Leetcode(53)-最大子序和

    给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 ...