稀疏数组
场景
我们在玩五子棋,围棋的时候. 整个棋盘是 19*19个点位. 每下完
一局棋.我们都会将棋谱保存起来.留待复盘使用.
但是我们总有的地方没有落子. 就是空白的.
如果将空白地方也存储起来. 我们需要使用一个 19*19 长度的数组存储数据.
我们将这局棋数字化. 数字化之后,可以得到如下图:
我们使用 数字1代表 黑色妻子. 数字2代表蓝色棋子
而整个数字化后的棋盘,可以看做一个二维数组.
上面图中的部分数字是0. 那么我们可以不用记录. 反正代表用户
的数字只有1和2
那么我们不记录0. 只记录1和2. 是不是就能节省空间呢.换句话说
这样提高了空间的利用率
思路
记录原来的数组有几行几列. 有多少个不同的值
把具有不同值的元素行列及值本身,记录在一个小规模的数组中. 从而缩小程序规模
示例
记得在学校的时候学习过笛卡尔坐标. 那么这个图是不是和笛卡尔
坐标特别像呢.我们可以看到. 每一列都记录了相当于一个 坐标系.记录了每一个 数字在第几行,第几列. 从而确定唯一坐标.
压缩
分析上图,我们需要记录这个棋盘是 19*19 的还是 9*9 或13*13
的.
我们需要记录 这个棋盘有几行,几列. 有多少个不同的数字. 这些
数字分别在哪一行,哪一列. 以及数字本身
看起来好像很多. 但我们三列足以完成
首先,创建一个数组. 数组长度是 棋盘不同数字个数+1.
第一行记录这个棋盘有多少行多少列
第二行开始记录,这个数字处在第几行,第几列.
以此类推