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. hive中如何查询除了其中某个字段剩余所有字段

    想要将hive分区表中的某个分区复制到新的分区中,使用如下sql语句 insert overwrite table zcfw_sda.sda04_core_request_base_ratio_ifr ...

  2. 数据库管理与迁移(Liquibase)

    SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖 ...

  3. Qt-绘图

    1  简介 参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=37 参考文档:<Qt教程.docx> 本文简单介绍Qt的绘图与绘图设备. ...

  4. 基础设计模式-03 从过滤器(Filter)校验链学习职责链模式

    1.职责链路模式 1.1UML图 1.2 职责链路模式的概念 为了避免处理对象的耦合关系,将对象连成一个链,沿着这个链进行访问,直到有一个对象处理位置: 1.3 优点 1.按照一定的顺序执行判断: 2 ...

  5. Javascript安全编程规范

    命名 1.原则——编码格式UTF-8,根据功能为变量与方法命名(尽量不缩写) 2.类——构造函数/类 使用驼峰命名法,且首字母大写 3.方法——动词.动宾结构,使用驼峰命名法,首字母小写 例如:get ...

  6. 不用破解版的 Navicat 了,几款免费且好用的 SQL 客户端送给你

    我是风筝,公众号「古时的风筝」. 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面. 没别的意思,今天就是为了给你推荐几款 MySQL 客户端,这几款 ...

  7. vscode F2无法使用

    rope库可能存在bug 解决方法: "python.jediEnabled": false //自动补全用微软自带

  8. nginx极简教程

    Nginx 极简教程 本项目是一个 Nginx 极简教程,目的在于帮助新手快速入门 Nginx. examples 目录中的示例模拟了工作中的一些常用实战场景,并且都可以通过脚本一键式启动,让您可以快 ...

  9. 证明:ThreadLocal的get,set方法无法防止内存泄漏

    先给出结论:get,set两个方法都不能完全防止内存泄漏,还是每次用完ThreadLocal都勤奋的remove一下靠谱. 前言:   看到有的博客说在把ThreadLocal的所有强引用置空前,调用 ...

  10. mysql中常见约束

    #常见约束 /* 含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性 分类:六大约束 NOT NULL:非空,用于保证该字段的值不能为空 比如姓名.学号等 DEFAULT:默认,用于 ...