Java数据结构和算法(2)之稀疏数组
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)之稀疏数组的更多相关文章
- Java数据结构和算法(二)——数组
上篇博客我们简单介绍了数据结构和算法的概念,对此模糊很正常,后面会慢慢通过具体的实例来介绍.本篇博客我们介绍数据结构的鼻祖——数组,可以说数组几乎能表示一切的数据结构,在每一门编程语言中,数组都是重要 ...
- 《java数据结构与算法》系列之“数组"
int arrayName = new int[10] ;2 int arrayLength = arrayName.length; 解释:java有两种数据类型,一种是基本类型,如int等,一种是引 ...
- Java数据结构和算法 - 数组
Q: 数组的创建? A: Java中有两种数据类型,基本类型和对象类型,在许多编程语言中(甚至面向对象语言C++),数组也是基本类型.但在Java中把数组当做对象来看.因此在创建数组时,必须使用new ...
- Java数据结构和算法 - 哈希表
Q: 如何快速地存取员工的信息? A: 假设现在要写一个程序,存取一个公司的员工记录,这个小公司大约有1000个员工,每个员工记录需要1024个字节的存储空间,因此整个数据库的大小约为1MB.一般的计 ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是 ...
- Java数据结构和算法(六)——前缀、中缀、后缀表达式
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...
- Java数据结构和算法(十四)——堆
在Java数据结构和算法(五)——队列中我们介绍了优先级队列,优先级队列是一种抽象数据类型(ADT),它提供了删除最大(或最小)关键字值的数据项的方法,插入数据项的方法,优先级队列可以用有序数组来实现 ...
- Java数据结构和算法(九)——高级排序
春晚好看吗?不存在的!!! 在Java数据结构和算法(三)——冒泡.选择.插入排序算法中我们介绍了三种简单的排序算法,它们的时间复杂度大O表示法都是O(N2),如果数据量少,我们还能忍受,但是数据量大 ...
- java数据结构与算法之栈(Stack)设计与实现
本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是一种用于 ...
- Java数据结构和算法 - 堆
堆的介绍 Q: 什么是堆? A: 这里的“堆”是指一种特殊的二叉树,不要和Java.C/C++等编程语言里的“堆”混淆,后者指的是程序员用new能得到的计算机内存的可用部分 A: 堆是有如下特点的二叉 ...
随机推荐
- hive中如何查询除了其中某个字段剩余所有字段
想要将hive分区表中的某个分区复制到新的分区中,使用如下sql语句 insert overwrite table zcfw_sda.sda04_core_request_base_ratio_ifr ...
- 数据库管理与迁移(Liquibase)
SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖 ...
- Qt-绘图
1 简介 参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=37 参考文档:<Qt教程.docx> 本文简单介绍Qt的绘图与绘图设备. ...
- 基础设计模式-03 从过滤器(Filter)校验链学习职责链模式
1.职责链路模式 1.1UML图 1.2 职责链路模式的概念 为了避免处理对象的耦合关系,将对象连成一个链,沿着这个链进行访问,直到有一个对象处理位置: 1.3 优点 1.按照一定的顺序执行判断: 2 ...
- Javascript安全编程规范
命名 1.原则——编码格式UTF-8,根据功能为变量与方法命名(尽量不缩写) 2.类——构造函数/类 使用驼峰命名法,且首字母大写 3.方法——动词.动宾结构,使用驼峰命名法,首字母小写 例如:get ...
- 不用破解版的 Navicat 了,几款免费且好用的 SQL 客户端送给你
我是风筝,公众号「古时的风筝」. 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面. 没别的意思,今天就是为了给你推荐几款 MySQL 客户端,这几款 ...
- vscode F2无法使用
rope库可能存在bug 解决方法: "python.jediEnabled": false //自动补全用微软自带
- nginx极简教程
Nginx 极简教程 本项目是一个 Nginx 极简教程,目的在于帮助新手快速入门 Nginx. examples 目录中的示例模拟了工作中的一些常用实战场景,并且都可以通过脚本一键式启动,让您可以快 ...
- 证明:ThreadLocal的get,set方法无法防止内存泄漏
先给出结论:get,set两个方法都不能完全防止内存泄漏,还是每次用完ThreadLocal都勤奋的remove一下靠谱. 前言: 看到有的博客说在把ThreadLocal的所有强引用置空前,调用 ...
- mysql中常见约束
#常见约束 /* 含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性 分类:六大约束 NOT NULL:非空,用于保证该字段的值不能为空 比如姓名.学号等 DEFAULT:默认,用于 ...