1.定义

稀疏数组可以看做是普通二位数组的压缩,但是这里说的普通数组是值无效数据量远大于有效数据量的数组,关于稀疏数组的运用有五子棋盘,地图等..

*当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组如图

2.好处

* 原数组中存在大量的无效数据占据了大量的存储空间,真正有用的数据却少之又少

*把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模

* 压缩存储可以节省存储空间以避免资源的不必要的浪费,在数据序列化到磁盘时,压缩存储可以提高IO效率

3.稀疏数组的结构

*记录数组一共有几行几列,有多少个不同的值

* 第一行存储原始数据总行数,总列数,总的非0数据个数

* 接下来每一行都存储非0数所在行,所在列,和具体值(如下图)

行列都是11的二位数组

把上面的二维数组转化为稀疏数组

备注:因为数组的下标是从0开始的,所以他们的标号也是从0开始的(重要)

4.二维数组 转 稀疏数组的思路

*遍历原始的二维数组,得到有效数据的个数 sum

*根据sum 就可以创建 稀疏数组 sparseArr int[sum + 1] [3]

*将二维数组的有效数据数据存入到 稀疏数组

5.稀疏数组转原始的二维数组的思路

*先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,

比如上面的 chessArr2 = int [11][11]

*在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可.

6.代码实现

 public class Sparsearray {

     public static void main( String[] args) {
System.out.println("===========二维数组转换稀疏数组============");
int[][] array=new int[11][11];
array[1][2]=1;
array[2][3]=2;
System.out.println("============转换前的二维数组============");
forToarray(array);
System.out.println("============转换后的二维数组============");
int[][] sparsearry = arrayToSparsearry(array);
forToarray(sparsearry);
System.out.println("===========将稀疏数组转化为原始数组============");
array = sparsearryToArray(sparsearry);
forToarray(array); }
/**
*二维数组转换稀疏数组
* @param array
*/
private static int [][] arrayToSparsearry(int[][] array) {
int sum=1;
for (int i = 0; i < array.length; i++) {
int[] datas=array[i];
for (int j = 0; j < datas.length; j++) {
if (array[i][j]!=0) {
sum++;
}
}
} int [][] sparse=new int[sum][3];
int s=0;
sparse[s][0]=array.length;
sparse[s][1]=array[0].length;
sparse[s][2]=sum-1;
for (int i = 0; i < array.length; i++) {
int[] datas=array[i];
for (int j = 0; j < datas.length; j++) {
int a=array[i][j];
if (a!=0) {
s++;
sparse[s][0]=i;
sparse[s][1]=j;
sparse[s][2]=a;
}
}
} return sparse;
}
/**
*遍历数组
* @param array
*/
private static void forToarray(int[][] array) {
for (int i = 0; i < array.length; i++) {
int [] ints=array[i];
for (int j = 0; j < ints.length; j++) {
System.out.print(" "+array[i][j]);
}
System.out.println("");
}
}
/*
* 稀疏数组转化为原始数组
* @param array
*/
private static int [][] sparsearryToArray(int[][] array) {
int [] [] arrays=new int [array[0][0]][array[0][1]];
for (int i = 1; i < array.length; i++) {
int[] js = array[i];
for (int j = 0; j < js.length; j++) {
arrays[array[i][0]][array[i][1]]=array[i][2];
} }
return arrays;
}
}

*执行后的结果如下

===========二维数组转换稀疏数组============
============转换前的二维数组============
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
============转换后的二维数组============
11 11 2
1 2 1
2 3 2
===========将稀疏数组转化为原始数组============
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0

Java数据结构和算法(2)之稀疏数组的更多相关文章

  1. Java数据结构和算法(二)——数组

    上篇博客我们简单介绍了数据结构和算法的概念,对此模糊很正常,后面会慢慢通过具体的实例来介绍.本篇博客我们介绍数据结构的鼻祖——数组,可以说数组几乎能表示一切的数据结构,在每一门编程语言中,数组都是重要 ...

  2. 《java数据结构与算法》系列之“数组"

    int arrayName = new int[10] ;2 int arrayLength = arrayName.length; 解释:java有两种数据类型,一种是基本类型,如int等,一种是引 ...

  3. Java数据结构和算法 - 数组

    Q: 数组的创建? A: Java中有两种数据类型,基本类型和对象类型,在许多编程语言中(甚至面向对象语言C++),数组也是基本类型.但在Java中把数组当做对象来看.因此在创建数组时,必须使用new ...

  4. Java数据结构和算法 - 哈希表

    Q: 如何快速地存取员工的信息? A: 假设现在要写一个程序,存取一个公司的员工记录,这个小公司大约有1000个员工,每个员工记录需要1024个字节的存储空间,因此整个数据库的大小约为1MB.一般的计 ...

  5. 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现

      本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型   栈是 ...

  6. Java数据结构和算法(六)——前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  7. Java数据结构和算法(十四)——堆

    在Java数据结构和算法(五)——队列中我们介绍了优先级队列,优先级队列是一种抽象数据类型(ADT),它提供了删除最大(或最小)关键字值的数据项的方法,插入数据项的方法,优先级队列可以用有序数组来实现 ...

  8. Java数据结构和算法(九)——高级排序

    春晚好看吗?不存在的!!! 在Java数据结构和算法(三)——冒泡.选择.插入排序算法中我们介绍了三种简单的排序算法,它们的时间复杂度大O表示法都是O(N2),如果数据量少,我们还能忍受,但是数据量大 ...

  9. java数据结构与算法之栈(Stack)设计与实现

    本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是一种用于 ...

  10. Java数据结构和算法 - 堆

    堆的介绍 Q: 什么是堆? A: 这里的“堆”是指一种特殊的二叉树,不要和Java.C/C++等编程语言里的“堆”混淆,后者指的是程序员用new能得到的计算机内存的可用部分 A: 堆是有如下特点的二叉 ...

随机推荐

  1. Double值保留两位小数的四种方法

    public class DoubleTest { //保留两位小数第三位如果大于4会进一位(四舍五入) double f = 6.23556; /** *使用精确小数BigDecimal */ pu ...

  2. 怎样用 I/O流读取txt文件?

    java.io包提供了用来永久保存对象状态的机制,可处理各种类型的流,如文件流.字节流.字符流等,还提供实现可串行化Serializable接口.可处理对象流. Java语言提供3种自动生成的标准流. ...

  3. 【盗版动归】Codeforces998C——Convert to Ones 归一操作

    嘤嘤嘤,因为最近文化课老师追的紧了+班主任开班会,所以这博客是赶制的赝品 题目: You've got a string a1,a2,…,ana1,a2,…,an, consisting of zer ...

  4. JVM零碎知识

    JVM常见XX参数 查看JVM默认值 常用基本配置参数 生产环境服务器变慢,如何诊断 生产环境CPU占用过高,如何诊断 JDK自带的JVM监控和性能分析工具 jps(虚拟机进程状况工具) jinfo( ...

  5. Jmeter系列(36)- 详解 Loop Controller 循环控制器

    如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 前言 这应该是最简单的控制器了,我们快 ...

  6. 华为交换机如何配置SSH远程登录,一分钟秒学会

    从事网络运维工作的小伙伴们都知道,在交换机正式上线时,必须完成配置SSH远程登录,这样做目的是为了日后,维护方便,不需要每次登录设备都要跑到机房,这样既不现实,又费事. 远程登录方式 目前网络设备中主 ...

  7. scrapy shell 遇到的问题

    有时候用scrapy shell来调试很方便,但是有些网站有防爬虫机制,所以使用scrapy shell会返回403,比如下面 有两种解决方法: (1):第一种方法是在命令上加上-s USER_AGE ...

  8. 日志套餐篇 - log4j2 logback全量套餐

    日志套餐篇 - log4j2 logback全量套餐 前情提要: Log4j Log4j2 logback是当下主流的日志框架 slf4j则是新一代的日志框架接口,logback直接实现了slf4j接 ...

  9. Ethical Hacking - POST EXPLOITATION(3)

    Spying - Capturing Key Strikes & Taking Screen Shots Log all mouse/keyboard events > keyscan- ...

  10. javascript : 复杂数据结构拷贝实验

    数组深拷贝看起来很简单. array.concat()就行了. 但是,如果数组里有对象呢? 实际上,你以为你拷贝了对象,但实际上你只拷贝了对象的引用(指针)! 我们可以做个试验. // test le ...