数据结构与算法(Java版) | 稀疏数组的应用场景
Posted 李阿昀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法(Java版) | 稀疏数组的应用场景相关的知识,希望对你有一定的参考价值。
接下来,我们就要正式进入第三章——稀疏数组和队列的学习中了,顾名思义,在这一章节我会为大家介绍两种数据结构,即稀疏数组和队列。当然,按照我们这套系列教程的安排,首先我会为大家讲解稀疏数组,稀疏数组讲解完毕才会给大家讲解队列。
还记得之前我给大家介绍我们这套系列教程时,讲过的我们这套系列教程所采用的一个授课方式嘛?不记得的,我这里再赘述一遍吧!我们这套系列教程采用的是如下这样一个授课方式,即:
先说一下要讲的数据结构或者算法的应用场景,然后引出该数据结构或者算法,接着剖析原理,紧接着分析实现步骤,当然,在这一步骤中,少不了需要用画图的方式来向大家进行说明,也就是说我会以图文并茂的方式来讲这一步,这样大家理解起来也会容易许多,最后则就是代码实现了。
于是,按照规矩,接下来我就要先给大家讲一讲稀疏数组的应用场景了。
稀疏数组的应用场景
先看一个实际的需求
这里,咱们不妨先来看一个实际的需求。
五子棋游戏,如下图所示,相信大家应该都有玩过吧!它算是一个比较经典的游戏了,我想没人没玩过吧,要是这个游戏你都没玩过,那你的童年到底是有多缺失啊!
如果你玩过这个游戏,那么不妨来思考一下这样一个问题,假设现在棋盘(注意,该棋盘是一个11×11的棋盘)上有两个子,如下图所示,一个黑子,一个蓝子,如果此时我们想要将该棋盘给保存起来,那么你会选择怎么做呢?
我想,大家脑海中能想到的最简单的一个思路就是将以上棋盘用一个二维数组给保存起来吧!如下图所示,可以看到该二维数组一共有11行11列,其中第2行第3列保存的是数据1,第3行第4列保存的是数据2,很显然,1代表的是黑子,而2代表的则是蓝子。
虽然将以上棋盘转成二维数组(即使用二维数组来记录棋盘)对于我们来说没有任何难度,非常简单,但是你有没有想过这样一个问题呢,就是以上二维数组里面保存的很多值竟都是默认值0,而如果要是这样的话,那不就是记录了很多没有意义的数据吗?于是,我就要问大家了,此时我们应该如何去解决这个问题呢?很简单,使用稀疏数组即可解决,说得具体点,就是使用稀疏数组来对以上二维数组进行一个压缩。
那么,问题又来了,稀疏数组是什么呢?我想,你一定很想急于知道吧,不是有那么一句话嘛,人这一生,要么忙着去活,要么忙着去死,听过这句话吧,言归正传,接下来我还是来给大家简单介绍一下稀疏数组吧!
稀疏数组的基本介绍
关于稀疏数组,大家首先需要知道的一点是,当一个数组中大部分元素为0,或者为同一个值时,我们就可以使用稀疏数组来保存该数组了。
其次,大家还需要知道的便是稀疏数组的处理方法了,即:
-
记录数组一共有几行几列,有多少个不同的值。
说白了,就是稀疏数组的第一行会记录原先二维数组的行数、列数以及一共有多少个不同的值。关于这一点,大家现在不理解也没关系,因为马上你就会知道稀疏数组长啥样了,知道稀疏数组长啥样之后,你自然便能理解这一点了。
-
把具有不同值的元素的行、列及值记录在一个小规模的数组中,从而缩小程序的规模。而这个所谓的小规模的数组,就是我们所说的稀疏数组。
那么,稀疏数组到底长啥样呢?这里,我们不妨先看一个图,如下所示,可以看到这是一个原始的二维数组,一共有6行7列,试想一下,如果我们就原封不动地保存这个原始的二维数组,那么是不是一共就得保存42个数据啊!
可要是使用稀疏数组来保存的话,那就变成下面这个样子了。
可以看到,稀疏数组的第一行记录的是原始二维数组共有几行几列以及多少个不同的值,其中,第1行第1列记录的是原始二维数组的行数,第1行第2列记录的是原始二维数组的列数,第1行第3列记录的是原始二维数组一共有多少个不同的值,注意,这些不同的值可都是非0的哟!
搞清楚稀疏数组的第一行记录的是什么之后,接下来我们就要搞清楚它下面的每一行记录的又是什么了。其实,你只要知道了稀疏数组的处理方法,你自然就能知道稀疏数组第一行下面的每一行记录的是什么了,很简单,记录的就是每一个非0值的行、列及其具体的数据大小。
现在大家该知道使用稀疏数组的好处了吧!就是可以缩小原始二维数组的规模。你想啊,使用稀疏数组之后,原先一个6×7的二维数组就变成了一个3×9的二维数组(也即稀疏数组),原先得保存42个数据,而现在则只需要保存27个数据就行了,这可不就起到了一个缩小原始二维数组规模的效果嘛!
以上便是稀疏数组的应用场景,嘻嘻😊,终于算是给大家讲完了,快累死我了!
以上是关于数据结构与算法(Java版) | 稀疏数组的应用场景的主要内容,如果未能解决你的问题,请参考以下文章
热榜!!!数据结构与算法:C语言版---数组与稀疏矩阵---强势来袭!