数据结构与算法——稀疏数组

文章目录


前言

当一个数组中大部分元素为0,或者为同一个值时,可以使用稀疏数组来保存该数组。


 

一、稀疏数组

稀疏数组可以用来压缩数组

处理方式:

记录数组一共有几行几列,有多少个要记录的值

把具有不同值的元素的行、列和值记录在一个小规模的数组中,从而缩小程序的规模

以数组中大多数的值为0举例:将非0值存储在稀疏数组中

  稀疏数组第一行第一列,存储数组总行数,第一行第二列,存储数组总列数,第一行第三列,存储数组非0值的个数;

  之后的每行,第一列存储非0值得行数,第二行存储非0值得列数,第三行存储值。

二、步骤

代码如下

public static void main(String[] args) {
		// 1.创建一个原始数组
		int[][] arr = new int[12][12];
		// 初始化数组的三个值
		arr[0][6] = 5;
		arr[3][5] = 9;
		arr[9][2] = 4;
		//2.先输出一遍原始数组
		System.out.println("******原始数组如下所示******");
		for (int[] a : arr) {
			for (int b : a) {
				System.out.print(b+" ");
			}
			System.out.println();
		}
		//3将二维数组转化成稀疏数组
		//3.1先遍历二维数组,得到非0数据的个数
		int sum=0;//设定非0个数
		for (int i = 0; i < 12; i++) {
			for (int j = 0; j < 12; j++) {
				if(arr[i][j]!=0){
					sum++;
				}
			}
		}
		//3.2创建对应的稀疏数组
		System.out.println("非零个数为:"+sum);
		int sparsArray[][] = new int[sum+1][3];
		//3.3给稀疏数组赋值
		sparsArray[0][0] = 12;//稀疏数组第一行第一列为arr的行数
		sparsArray[0][1] = 12;//稀疏数组第一行第二列为arr的列数
		sparsArray[0][2] = sum;//稀疏数组第一行第三列为arr中非0的个数
		//3.4遍历二维数组,将非0的值存放在稀疏数组中
		int count = 0;//设定稀疏数组的总个数
		for (int i = 0; i < 12; i++) {
			for (int j = 0; j < 12; j++) {
				if(arr[i][j]!=0){
					count++;//稀疏数组第一行已经存放数据了
					//当arr[i][j]非0时
					sparsArray[count][0] = i;//将非0的行索引赋给稀疏数组
					sparsArray[count][1] = j;//将非0的列索引赋给稀疏数组
					sparsArray[count][2] = arr[i][j];//将非0的值赋给稀疏数组
				}
			}
		}
		//4.对系数数组输出
		System.out.println("******稀疏数组如下所示******");
		for (int[] a : sparsArray) {
			for (int b : a) {
				System.out.print(b+" ");
			}
			System.out.println();
		}
		//5.将稀疏数组恢复成原始的二维数组
		//5.1根据稀疏数组的第一行的数据,创建原始的二维数组
		int[][] newarr = new int[sparsArray[0][0]][sparsArray[0][1]];
		//5.2读取稀疏数组后几行的数据,并赋给原始的二维数组
		for(int i=1;i<sparsArray.length;i++){
			newarr[sparsArray[i][0]][sparsArray[i][1]] = sparsArray[i][2];
		}
		//6.输出恢复后的二维数组
		System.out.println("******恢复数组如下所示******");
		for (int[] a : newarr) {
			for (int b : a) {
				System.out.print(b+" ");
			}
			System.out.println();
		}
	}

代码运行结果

总结

按照代码思路,可以一步步将数组转化成稀疏数组。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值