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. 使用CImage双缓冲

    一普通显示:现在的VC显示图片非常方便,远不是VC6.0那个年代的技术可比,而且支持多种格式的如JPG,PNG. CImage _img; 初始化: _img.Load(L"map.png& ...

  2. 数据库周刊30丨数据安全法草案将亮相;2020数据库产业报告;云南电网上线达梦;达梦7误删Redo Log;Oracle存储过程性能瓶颈;易鲸捷实践案例……

    摘要:墨天轮数据库周刊第30期发布啦,每周1次推送本周数据库相关热门资讯.精选文章.干货文档. 热门资讯 1.数据安全法草案即将亮相:将确立数据分级分类管理.应急处置制度[摘要]数据安全法草案即将在本 ...

  3. Zookeeper Watcher 流程分析(结合源码)

    概述 ZK提供了分布式数据的发布/订阅功能,一个典型的发布/订阅模型系统定义了一种一对多的订阅关系,能够让多个订阅者同时监听某个主题对象,当这个主题对象自身状态发生变化时,会通知所有的订阅者.在ZK中 ...

  4. 想做时间管理大师?你可以试试Mybatis Plus代码生成器

    1. 前言 对于写Crud的老司机来说时间非常宝贵,一些样板代码写不但费时费力,而且枯燥无味.经常有小伙伴问我,胖哥你怎么天天那么有时间去搞新东西,透露一下秘诀呗. 好吧,今天就把Mybatis-pl ...

  5. window的常用操作

    一.window.location location对象属性 1.location.href 属性返回当前页面的 URL. 2.location.pathname 返回路径和方法名称 3.locati ...

  6. 洛谷 P4408 [NOI2003]逃学的小孩

    题目传送门 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:“喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?”一听说要考试,Chris的父母就心急如焚, ...

  7. 04 Vue组件

    组件 每一个组件都是一个vue实例 每个组件均具有自身的模板template,根组件的模板就是挂载点 每个组件模板只能拥有一个根标签 子组件的数据具有作用域,以达到组件的复用 1.根组件 <di ...

  8. 一篇夯实一个知识点系列--python装饰器

    写在前面 本系列目的:希望可以通过一篇文章,不望鞭辟入里,但求在工程应用中得心应手. 装饰器模式是鼎鼎大名的23种设计模式之一.装饰器模式可以在不改变原有代码结构的情况下,扩展代码功能. Python ...

  9. Linux01 /Linux初识

    Linux01 /Linux初识 目录 Linux01 /Linux初识 1. 服务器 2. Linux系统介绍 3. linux简单介绍 4. VMware与Centos系统安装 5. 各个连接协议 ...

  10. Python网络编程03 /缓存区、基于TCP的socket循环通信、执行远程命令、socketserver通信

    Python网络编程03 /缓存区.基于TCP的socket循环通信.执行远程命令.socketserver通信 目录 Python网络编程03 /缓存区.基于TCP的socket循环通信.执行远程命 ...