数据结构与算法01:稀疏数组

基本介绍

当二维数组大部分元素为0或大部分值相同的情况下,我们可以用稀疏数组来储存。

处理方法

1.记录下数组有几行几列,以及多少个不同的值
2.把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。

应用场景

在五子棋的棋盘中,除了黑白子其余地方都是空的,可以用稀疏数组来存储。
在这里插入图片描述

思路

二维数组转稀疏数组的思路

1.遍历原始的二维数组,得到有效值元素的个数sum;
2.根据sum去创建二维稀疏数组sum行3列;
3.将二维数组有效数据存入稀疏数组中

稀疏数组转二维数组的思路

1.先读取稀疏数组第一行的数据,根据第一行的数据创建二维数组
2.读取稀疏数组第一行外的数据,循环遍历进行赋值

代码实现

package day11;



public class Test01 {
    
    
	public static void main(String[] args) {
    
    
		int[][] arr1 = new int[11][11];//原始二维数组
		arr1[1][2] = 1;//有效数据
		arr1[2][3] = 2;//有效数据
		for(int i = 0; i < 11; i++) {
    
    //打印原始数组
			for(int j = 0; j < 11; j++) {
    
    
				System.out.print(arr1[i][j] + "\t");
			}
			System.out.println();
		}
		System.out.println();//换两行以便区分
		System.out.println();
		int sum = 0;
		for(int i = 0; i < 11; i++) {
    
    
			for(int j = 0; j < 11; j++) {
    
    
				if(arr1[i][j]!=0) {
    
    
					sum++;//遍历得出有效数据总数
				}		
			}
		}
		int flag = 0;
		int[][] sa = new int[sum+1][3];
		sa[0][0] = arr1.length; 
		sa[0][1] = arr1[0].length; 
		sa[0][2] = sum; 
		for(int i = 0; i < 11; i++) {
    
    
			for(int j = 0; j < 11; j++) {
    
    
				if(arr1[i][j]!=0) {
    
    
					flag++;//稀疏数组赋值
					sa[flag][0] = i;
					sa[flag][1] = j;
					sa[flag][2] = arr1[i][j];
				}
			}
		}
		for(int i = 0; i < sa.length; i++) {
    
    //打印二维数组
			for(int j = 0; j < sa[i].length; j++) {
    
    
				System.out.print(sa[i][j] + "\t");
			}
			System.out.println();
		}
		System.out.println();//换行区分
		System.out.println();
		int[][] arr2 = new int[sa[0][0]][sa[0][1]];
		for(int i = 1; i < sa.length; i++) {
    
    //还原
			arr2[sa[i][0]][sa[i][1]] = sa[i][2];
		}
		for(int i = 0; i < 11; i++) {
    
    //打印
			for(int j = 0; j < 11; j++) {
    
    
				System.out.print(arr2[i][j] + "\t");
			}
			System.out.println();
		}
	}
}

写在最后

今天超梦开开心心地完成了项目三,非常开心,所以趁着不困把稀疏数组的博客更了,下一篇将会是烦恼了我好久的项目三~

我是超梦,期待与你一起变好~~~

猜你喜欢

转载自blog.csdn.net/weixin_45834777/article/details/107240580