结构一 - 稀疏数组

Posted torain

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构一 - 稀疏数组相关的知识,希望对你有一定的参考价值。

棋盘

技术图片

现在有一个11*11的棋盘如图,需要表示出棋盘和棋子的关系。
用二维数组表示,用0表示空白,1表示黑子,2表示蓝子,此时二维数组中有效的数据为2个,剩下的均为0。
这个时候又需要将当前的棋盘序列化到磁盘上,那么浪费了非常多的空间来存储0。
我们可以用稀疏数组来解决这个问题。

稀疏数组

顾名思义稀疏就是将数组中稀疏分布的有效数据存储起来作为一个新的数组。
稀疏数组的结构有两部分第一部分是第一个数据,存储原始数组的行列数有效数据个数。第二部分是剩下的所有的数据,这是数组的有效数据。
二维数组的稀疏数组:

行数 row column value
1 原始数组有11行 原始数组有11列 有效数据有2个
2 第一条有效数据的行数 第一条有效数据的列数 第一条有效数据的值
... ... ... ...
n+1 第n条有效数据的行数 第n条有效数据的列数 第n条有效数据的值

将原数组转化为稀松数组后

技术图片

需求:将上述二维数组转换为稀疏数组,然后序列化到本地磁盘,接着再反序列化重新转换为二维数组。

package com.cnblog.sparearray;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Arrays;

public class SoarseArrayTest {
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		int[][] chessArr = new int[11][11];
		chessArr[1][2] = 1;
		chessArr[2][3] = 2;
		// 序列化
		serializeArr(chessArr);
		// 反序列化
		deserializationArr();
	}
	/**
	 * 将二维数组序列化至本地磁盘
	 * @param chessArr
	 * @throws IOException 
	 */
	public static void serializeArr(int[][] chessArr) throws IOException{
		
		// 将二维数组先转换为稀疏数组,
		// 审查有效数据
		int num = 0;
		for (int[] row : chessArr){
			for (int data : row) {
				if (data != 0){
					num++;
				}
			}
		}
		
		// 创建稀疏数组 length = num + 1;第一行要先存上值;列数必然为3
		int[][] sparseArr = new int[num + 1][3]; 
		sparseArr[0][0] = chessArr.length;
		sparseArr[0][1] = chessArr[0].length;
		sparseArr[0][2] = num;
		
		// 循环存入稀松数组
		int count = 1;
		for (int i = 0; i < chessArr.length; i++) {
			for (int j = 0; j < chessArr[0].length; j++) {
				if (chessArr[i][j]!=0){
					sparseArr[count][0] = i;
					sparseArr[count][1] = j;
					sparseArr[count][2] = chessArr[i][j];
					count++;
				}
			}
		}
		for (int[] row : sparseArr) {
			System.out.println(Arrays.toString(row));
		}
		
		// 创建序列化流序列化数据
		FileOutputStream fos = new FileOutputStream("D:/JavaIO/file.data");
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(sparseArr);
		oos.close();
	}
	/**
	 * 将本地磁盘的文件读取还原为二维数组并打印输出
	 * @throws FileNotFoundException
	 * @throws IOException
	 * @throws ClassNotFoundException
	 */
	public static void deserializationArr() throws FileNotFoundException, IOException, ClassNotFoundException{

		// 反序列化
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:/JavaIO/file.data"));
		int[][] sparseArr = (int[][]) ois.readObject();
		// 创建二维数组接收数据
		
		int[][] chessArr = new int[sparseArr[0][0]][sparseArr[0][1]];
		for (int i = 1; i < sparseArr.length; i++) {
			chessArr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
		}
		
		for (int[] row : chessArr){
			System.out.println(Arrays.toString(row));
		}
	}
}

运行结果

技术图片






以上是关于结构一 - 稀疏数组的主要内容,如果未能解决你的问题,请参考以下文章

结构一 - 稀疏数组

JAVA描述算法和数据结构(01):稀疏数组和二维数组转换

Java数据结构与算法——稀疏数组和二维数组之间的转换

java数据结构与算法一:稀疏数组

Java数据结构—稀疏数组

数据结构_线性结构(稀疏数组)