一、概念&引入

  什么是稀疏数组?

  稀疏数组是面对一个二维数组中有众多重复元素的情况下,为了节省磁盘空间,将此二维数组转化为更加节省空间的一种数组,我们叫他稀疏数组。

  只是听概念或许会看不明白,我们来用图来演示一下:

  如图模拟为一个五子棋棋盘,其中1代表黑子,2代表白子(蓝子),我们在将其存入磁盘中,如果只是单纯的用文件io的方式将此二维数组存入磁盘,必然会造成磁盘空间的大大浪费,这时候就需要我们的稀疏数组出场了,咱们先看一下他是什么样子:

  行(row) 列(col) 值(value)
[0] 11 11 2
[1] 1 2 1
[2] 2 3 2

我们看到了一个三行两列的二维数组,首先我们看第一行,第一行的第一列(row)代表原数组有多少行,第一列的第二行(row)代表原数组有多少列,第一行第三列则代表原数组总共有多少个数据,在这个具体的例子里面,原数组是11*11,有两个值非零的值,所以第一列第三行的value值为2。

刚刚讲了第一行存储了什么东西,我们可以简单概括一下,第一行存储了原数组的整体信息,保留行,列,以及有多少个非零数值,下面我们来分析第二行。第一行存储了整体的结构,下面应当就是具体的数值,我们或许可以大致根据表格上面的文字可以猜到,第一行是存储具体的某个数据的行,第二列用于存储某个具体数值的列,第三列则用于存储具体的数值,例如:我们从上往下找发现第2行第3列为第一个非零的数值,我们这时候就可以将其存入稀疏数组中,由于Java中数组的元素存储是从零开始,所以我们第二行第三列的数据存储到具体的数组中是1,2,1,分别代表行,列,值。第三行同理,你也可以自己思考一下如何填入数据。

tips:需要强调一点:我们在填入数据的时候应当是有个count来进行计数,计数完了之后将其存入第一行的value中,我们通过value的值来维护数组的使用,如果有删除或者插入操作,我们对value的值进行修改,从而完成对数据的读取。

二、代码实现

public  static final int sparseRow = 3;
public static void main(String[] args) {
int[][] oriArray = {
{0,0,0,0},
{0,1,0,0},
{0,0,1,0},
{2,0,0,0},
{0,0,0,2} };//静态来创建
int count = 0;
    for(int[] arr : oriArray) {
for(int i :arr) {
System.out.print(i+" ");
if(i != 0) {
count ++;
}
}
System.out.println("");
} System.out.println("********************"); //init sparse
int[][] sparse = new int[count+1][sparseRow];
//init the first row
sparse[0][0] = oriArray.length;
sparse[0][1] = oriArray[0].length;
sparse[0][2] = count;
System.out.println("count:"+count); //通过value进行赋值,value就相当于稀疏数组的行(row)
int value = 0;
for(int m=0;m<oriArray.length;m++) {
for(int n=0;n<oriArray[m].length;n++) {
if(oriArray[m][n]!=0) {
sparse[++value][0] = m;
sparse[value][1] = n;
sparse[value][2] = oriArray[m][n];
}
}
} //查看稀疏数组
System.out.println("sparse: ");
for(int[] row:sparse) {
for(int col:row) {
System.out.print(col+" ");
}
System.out.println(" ");
} System.out.println("SUCCESSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS!"); //上面是转换操作,下面来进行读取操作。 int[][] arrNew =new int[sparse[0][0]][sparse[0][1]];
//从1开始,count结束,共有count个,所以一层循环即可实现
   for(int j=1;j<count+1;j++) {
arrNew[j][sparse[j][1]] = sparse[j][2];
} //foreach来遍历输出
System.out.println("new : ");
for(int[] rowNew:arrNew) {
for(int colNew:rowNew) {
System.out.print(colNew+" ");
}
System.out.println(" ");
}

}

三、小结

稀疏数组的思路与具体实现并不难,在数据结构中很多比较难的是概念与思想,只要咱们把握住了数据结构与算法的精髓之处,写成代码具体实现也不是很难了。

我是福尔斯甘,如果对本篇有疑问,或者发现有什么错误之处,欢迎提出指出,觉得评论不方便的话,本人邮箱是96532354@qq.com,qq同号,欢迎共同学习讨论问题,
谢谢大家支持~~

数据结构与算法之java语言实现(一):稀疏数组的更多相关文章

  1. C#数据结构与算法系列(二):稀疏数组(SparseArray)

    1.介绍 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组.    稀疏数组的处理方法是: 1.记录数组一共有几行几列,有多少个不同的值    2.把具有不同值的元素的 ...

  2. 深度实战玩转算法, Java语言7个经典应用诠释算法精髓

    深度实战玩转算法,以Java语言主讲,通过7款经典好玩游戏,真正将算法用于实际开发,由算法大牛ACM亚洲区奖牌获得者liuyubobobo主讲,看得见的算法,带领你进入一个不一样的算法世界,本套课程共 ...

  3. 数据结构与算法【Java】02---链表

    前言 数据 data 结构(structure)是一门 研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构才可以编写出更加漂亮,更加有效率的代码. 要学习好数据结构就要多多考虑如何将生 ...

  4. 数据结构与算法【Java】03---栈

    前言 数据 data 结构(structure)是一门 研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构才可以编写出更加漂亮,更加有效率的代码. 要学习好数据结构就要多多考虑如何将生 ...

  5. 数据结构与算法【Java】05---排序算法总结

    前言 数据 data 结构(structure)是一门 研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构才可以编写出更加漂亮,更加有效率的代码. 要学习好数据结构就要多多考虑如何将生 ...

  6. 数据结构与算法【Java】08---树结构的实际应用

    前言 数据 data 结构(structure)是一门 研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构才可以编写出更加漂亮,更加有效率的代码. 要学习好数据结构就要多多考虑如何将生 ...

  7. 数据结构和算法(Java版)快速学习(线性表)

    线性表的基本特征: 第一个数据元素没有前驱元素: 最后一个数据元素没有后继元素: 其余每个数据元素只有一个前驱元素和一个后继元素. 线性表按物理存储结构的不同可分为顺序表(顺序存储)和链表(链式存储) ...

  8. 常用数据结构及算法C#/Java实现

    常用数据结构及算法C#实现 1.冒泡排序.选择排序.插入排序(三种简单非递归排序) ,, , , , , , , , , }; //冒泡排序 int length = waitSort.Length; ...

  9. 数据结构和算法(Java版)快速学习(数组Array)

    Java数组 在Java中,数组是用来存放同一种数据类型的集合,注意只能存放同一种数据类型. 用类封装数组实现数据结构 数据结构必须具有以下基本功能: ①.如何插入一条新的数据项 ②.如何寻找某一特定 ...

随机推荐

  1. My Eclipse 配置

    设置编码格式 点击Windows → preference → WorkSpace 设置编码格式 点击Windows → preference → General →Appearence → Colo ...

  2. 【Java必修课】String.intern()原来还能这么用(原理与应用)

    1 简介 String.intern()是JDK一早就提供的native方法,不由Java实现,而是底层JVM实现,这让我们对它的窥探提高了难度.特别是在Oracle收购了Sun公司后,源代码不开源了 ...

  3. 深度学习tensorflow实战笔记 用预训练好的VGG-16模型提取图像特征

    1.首先就要下载模型结构 首先要做的就是下载训练好的模型结构和预训练好的模型,结构地址是:点击打开链接 模型结构如下: 文件test_vgg16.py可以用于提取特征.其中vgg16.npy是需要单独 ...

  4. 星空 题意转化,差分,状压DP

    好题(爆搜和puts("2")一个分(雾)),不得不说思维真的强. 首先发现区间翻转很难受,考虑用差分(异或满足可逆性),注意是从0到n+1 然后就转化题意,操作改为选取距离为L的 ...

  5. python学习之【第九篇】:Python中的变量作用域

    1.前言 Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的. 2.变量作用域 变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称.Python的作 ...

  6. LCD 调试总结

    (1) 液晶显示模式 并行:MCU接口.RGB接口.Vysnc接口 串行:SPI接口.MDDI接口 (2) 屏幕颜色 实质上即为色阶的概念.色阶是表示手机液晶显示屏亮度强弱的指数标准,也就是通常所说的 ...

  7. 如何在HTML中设置字体颜色,你知道这几种方式吗?

    color设置字体颜色 在color设置字体颜色之前,我们首先了解color在CSS中有几种取值方式,一共有4种方式,若有不全还请在评论区告知谢谢,4种方式如下: 十六进制.十进制. 英文单词.十六进 ...

  8. python中程序的异常处理

    什么叫异常? 导致程序异常退出叫做异常 try...except...else 如果要抓取某种特定异常可以用except ERROR as e else:如果程序正常执行那么会执行else里面的代码 ...

  9. jade 学习笔记 - gulp 自动编译

    实时监控   jade -P -w .\test1.jade sublime 分栏,可以看到实时修改情况     1. 元素写法 doctype html <!--[if IE8]>< ...

  10. 021.掌握Pod-Pod调度策略

    一 Pod生命周期管理 1.1 Pod生命周期 Pod在整个生命周期过程中被系统定义了如下各种状态. 状态值 描述 Pending API Server已经创建该Pod,且Pod内还有一个或多个容器的 ...