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. QT之——QTableWidget拖拽单元格并替换内容(进阶)

    所需待重写函数: [virtual] bool QObject::eventFilter(QObject *watched, QEvent *event); /* * Filters events i ...

  2. Web漏洞扫描-Burp Suite

    Web漏洞扫描-Burp Suite 一.Burp Suite概述 二.功能及特点 三.Burp Suite安装 四.Burp Suite使用 一.Burp Suite概述 安全渗透界使用最广泛的漏扫 ...

  3. js截取+全部替换+字符串

    //将关键字标志显示到页面中 function showKeyWord(showStr) { var keyword = $("#keyword").val();//页面中的关键字 ...

  4. HDU 6264 (深搜,数论)

    题目链接 题意 求\(\sum_{d|n}\phi (d) \times {n\over d}\),其中\(\phi(n) = n\prod_{p|n}({1-{1\over p}})\) 分析 将\ ...

  5. ACM#学习心得0

    加入实验室也有些日子了,这是第一个近来的小小学习心得 1.在之前的训练题和考核题以及平时刷过的题中,我发现自己对字符串这一块的基础知识掌握还是比较差的,总是不能正确的接收的字符或字符串. 这两个星期, ...

  6. 活动精彩实录 | 阿里云刘军民(米诺):Cassandra中文社区年度回顾

    点击这里观看完整视频 大家好,我是刘军民,我是阿里云数据库的产品经理,目前负责云数据库的产品规划以及相关工作.曾在2019年和多位小伙伴一起发起了中文社区,我希望有更多的小伙伴能加入到社区建设中,这样 ...

  7. C++ string (浅谈)

    浅谈string <string> typedef basic_string<char> string; 本篇主要内容是简单地介绍 string类 在竞赛方面较实用的一些功能, ...

  8. 使用 Tye 辅助开发 k8s 应用竟如此简单(二)

    续上篇,这篇我们来进一步探索 Tye 更多的使用方法.本篇我们来了解一下如何在 Tye 中使用服务发现. Newbe.Claptrap 是一个用于轻松应对并发问题的分布式开发框架.如果您是首次阅读本系 ...

  9. C# 类 (11) - Const

    Const variable 变量 ,值可变的constant 常量,不可变,C# 里关键字是const当我们定义一个常量的时候,需要立马赋值,以后不能再改这个量了我们可以把常量定义在 method ...

  10. C++ part4

    红黑树 references: 红黑树详细分析,看了都说好 关于红黑树(R-B tree)原理,看这篇如何 性质: 1.节点是红色或黑色 2.根节点是黑色 3.叶子节点(叶子节点均为NULL)都是黑色 ...