当前位置 博文首页 > justLym的博客:Java数据结构----稀疏数组

    justLym的博客:Java数据结构----稀疏数组

    作者:[db:作者] 时间:2021-09-12 18:04

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

    解决方案

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

    解决方案优劣势分析

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

    稀疏数组简介

    在这里插入图片描述

    代码实现

    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];
    		}
    	}
    }
    

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

    cs