数据结构与算法-稀疏数组

稀疏数组

场景

我们在玩五子棋,围棋的时候. 整个棋盘是 19*19个点位. 每下完
一局棋.我们都会将棋谱保存起来.留待复盘使用.
但是我们总有的地方没有落子. 就是空白的. 
如果将空白地方也存储起来. 我们需要使用一个 19*19 长度的数组存储数据.

在这里插入图片描述

我们将这局棋数字化. 数字化之后,可以得到如下图:

在这里插入图片描述

我们使用 数字1代表 黑色妻子. 数字2代表蓝色棋子

而整个数字化后的棋盘,可以看做一个二维数组.

上面图中的部分数字是0. 那么我们可以不用记录. 反正代表用户
的数字只有1和2
那么我们不记录0. 只记录1和2. 是不是就能节省空间呢.换句话说
这样提高了空间的利用率

思路

记录原来的数组有几行几列. 有多少个不同的值
把具有不同值的元素行列及值本身,记录在一个小规模的数组中. 从而缩小程序规模

示例

在这里插入图片描述

记得在学校的时候学习过笛卡尔坐标. 那么这个图是不是和笛卡尔
坐标特别像呢.我们可以看到.  每一列都记录了相当于一个 坐标系.记录了每一个 数字在第几行,第几列. 从而确定唯一坐标.

压缩

在这里插入图片描述

分析上图,我们需要记录这个棋盘是 19*19 的还是 9*9 或13*13
的.
我们需要记录 这个棋盘有几行,几列. 有多少个不同的数字. 这些
数字分别在哪一行,哪一列. 以及数字本身
看起来好像很多. 但我们三列足以完成

在这里插入图片描述

首先,创建一个数组. 数组长度是 棋盘不同数字个数+1. 
第一行记录这个棋盘有多少行多少列
第二行开始记录,这个数字处在第几行,第几列.
以此类推
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值