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: 堆是有如下特点的二叉 ...
随机推荐
- Idea+springboot入坑之路
环境准备 IDEA 社区版: 2019.3 jdk: 1.8.0_241 tomcat: 7.0.99 maven: 3.6.3 spring-boot:2.2.5.RELEASE 插件 spring ...
- 【总结】Array、ArrayList、List
一.Array(数组) 1.申明时必须要指定数组长度. 2.数据类型安全. 申明数组如下: 1 class Program 2 { 3 static void Main(string[] args) ...
- Elasticsearch从入门到放弃:分词器初印象
Elasticsearch 系列回来了,先给因为这个系列关注我的同学说声抱歉,拖了这么久才回来,这个系列虽然叫「Elasticsearch 从入门到放弃」,但只有三篇就放弃还是有点过分的,所以还是回来 ...
- 《UNIX环境高级编程》(APUE) 笔记第十一章 - 线程
11 - 线程 Github 地址 1. 线程概念 典型的 UNIX进程 可以看成只有一个 控制线程 :一个进程在某一时刻只能做一件事情.有了 多个控制线程 ,就可以把进程设计成在某一时刻能够做不止一 ...
- 部署LNMP环境——Yum安装(113资讯网)
Yum安装优点:安装东西,方便快捷,特别是不用考虑包依赖 教程(Centos做演示,其他系统大同小异): 1.更换国内Yum源: [root@root xx ]# rm -rf /etc/yum.re ...
- Django项目中集成第三方登录时出现的错误
原以为是被反爬 没想到 总结:这里的http应该是https协议,以后要更加小心 了,不能犯这种低级错误
- 原生开发、H5开发、混合移动开发的优缺点
一.原生开发(Native App开发) 原生开发,是在Android.IOS等移动平台上利用官方提供的开发语言.开发类库.开发工具进行App开发.比如Android是利用Java.Eclipse.A ...
- smtp 发送邮件实例
发送邮件的关键点在于邮箱服务器地址是否一致 //smtp 服务器地址,咨询 smtp 提供商,例如 smtp.126.net 这种格式,端口和服务器地址是配套的,一般是 465 或者 25 SmtpC ...
- java 面向对象(七):类结构 方法(四)递归方法
1.定义:递归方法:一个方法体内调用它自身.2.如何理解递归方法?> 方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无须循环控制.> 递归一定要向已知方向递归,否则这种 ...
- 数据可视化之powerBI技巧(七)从Excel到PowerBI,生成笛卡尔积的几种方式
假如分别有100个不重复的姓和名,把每个姓和名进行组合匹配,就可以得到一万个不重复的姓名组合,这种完全匹配的方式就是生成一个姓名的笛卡尔积. 下面就来看看生成笛卡尔积的几种方式,为了展现的方便,以5个 ...