稀疏矩阵的压缩与还原(Java实现)
1.稀疏矩阵的概念
在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵,如:
2.稀疏矩阵的压缩
如果要把一个含有如此多0元素的稀疏矩阵存储到计算机中,这些没有意义的0同样地会消耗掉计算机的内存,那么这势必造成计算机内存的浪费。那么,对于稀疏矩阵的存储,我们应该如何去处理呢?下面介绍一个例子:
例: 现在要模拟一个11*11的五子棋棋盘的存档和续局。棋盘上有黑、白两种棋子,分别用1、2来表示,没有棋子的地方,则用0来表示。假设这个棋盘是只有3颗棋子,2颗白棋子,1颗黑棋子,则该棋盘抽象出来,就是一个稀疏矩阵,其中非0元素只有3个,分别是1,2,2。现在,不想下棋了,那么要保存这个棋盘,也就是保存这个稀疏矩阵。
图解思路:
棋盘上的状态如图
我们从图所得到的信息:棋盘矩阵是11 * 11的,有3颗棋子
黑子所在的位置是矩阵的第3行第3列,值是1
白子所在的位置是矩阵的第6行第2列、第4行第5列,值都为2
转化成数组的存储,就是:
黑子所在的位置是矩阵的第2行第2列,值是1
白子所在的位置是矩阵的第5行第1列、第3行第4列,值都为2(因为数组的下标是从0开始的)
那么,我们可以将上面的信息抽象成一个新的二维数组:
这样就实现了稀疏矩阵的压缩
下面是代码实现:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class SparseArray {
public static void main(String[] args) throws IOException {
//创建一个原始的二维数组11*11
//0:表示无棋子,1表示黑子