Java数据结构----稀疏数组

我们先看一个实际的需求:
编写一个五子棋盘程序,并存在退出后存盘功能和续上盘的功能。
需求模拟图

解决方案

  • 方案一:将这个棋盘模拟成一个二维数组,将数据存储起来。
  • 方案二:使用稀疏数组,将棋盘存储起来,并达到一个数据压缩的效果。

解决方案优劣势分析

  • 方案一:
  • 优势: 简单方便,代码简单。
  • 劣势: 造成数据冗余,有很多不必要的数据存储下来了。
  • 方案二:
  • 优势:节省储存空间
  • 劣势:代码稍微复杂一些

稀疏数组简介

在这里插入图片描述

代码实现

public class SparseArray {
	public static void main(String[] args) {
		// 首先我们创建一个存储有数据的二维数组,6行7列
		int[][] array = new int[6][7];
		// 给数组里面添加数据
		int[0][2] = 22;
		int[0][6] = 15;
		int[1][1] = 11;
		int[1][5] = 17;
		int[2][3] = -6;
		int[3][5] = 39;
		int[4][0] = 91;
		int[5][2] = 28;
	}

	/**
	* 传入一个非空大小的二维数组,转成一个二维的稀疏数组
	*
	* @param 二维数组
	*/
	public int[][] arrayToSparse(int[][] array) {
		// 1. 遍历数组计算出该数组的有效数据的个数
		int sum = 0;
		for (int i = 0;i < array.length();i++) {
			for (int j = 0;i< array[0].length();j++) {
				if (array[i][j] != 0) {
					sum += 1;
				}
			}
		}

		// 2. 创建一个稀疏数组
		int[][] sparse = int[sum+1][3];

		// 给第一行填充数据
		sparse[0][0] = array.length();
		sparse[0][1] = array[0].length();
		sparse[0][2] = sum;

		// 3. 遍历数组给稀疏数组填充数据
		int row = 1;
		for (int i = 0;i < array.length();i++) {
			for (int j = 0;i< array[0].length();j++) {
				if (array[i][j] != 0) {
					// 记录数据行数
					sparse[row][0] = i;
					// 记录数据列数
					sparse[row][1] = j;
					// 记录数据
					sparse[row][2] = array[i][j];
					row += 1;
				}
			}
		}

		// 4. 返回稀疏数组
		return sparse;
	}

	/**
	* 将稀疏数组复盘成为普通的数组
	* 
	* @param sparse 稀疏数组
	*/
	public int[][] sparseToArray(int[][] sparse) {
		// 1. 创建一个普通的数组
		int[][] array = new int[sparse[0][0]][sparse[0][1]];

		// 2. 遍历稀疏数组
		for (int i = 1;i < sparse.length();i++) {
			array[sparse[i][0]][sparse[i][1]] = sparse[i][3];
		}
	}
}

代码写完了,这种方式储存数据可以达到压缩的效果,有人说你的步骤这么麻烦,还不如直接存起来就行了,其实这是一个用时间换空间的算法。

发布了7 篇原创文章 · 获赞 3 · 访问量 276

猜你喜欢

转载自blog.csdn.net/justLym/article/details/104232801