2021-08-01

二维数组转化为稀疏数组

各位看官你们好!感谢各位帅锅靓妹捧场!!!

刚刚开始学习数据结构和算法,来CSDN记录总结一下,第一次写博客,献丑了!

一、二维数组

二维数组上述图片为一个8×8的数组。
由于数据较多,所以这样的二维数组在存储需要空间是较大的并且时间读取长的。
由于数据中0反复出现,而数组创建时所有数据都默认为0,为了节约空间和时间,我们会需要对其进行压缩,即把所有重复的0都认作无效数值,将数组的有用信息记录到一个新的二维数组中。

二、稀疏数组

稀疏数组
上述图片为一个4×3的数组。
这里的稀疏数组也是二维数组,是将二维数组压缩后的二维数组。
稀疏数组中第一行数据分别表示:原二维数组的行数、列数、有效数值个数。从第二行起,每一列代表的是每一个有效数值在二维数组中的行值、列值、值(由于下标从0开始,所以行值=行数-1)

三、转化思路

Ⅰ.创建一个稀疏数组(二维数组),稀疏数组的行数根据<原二维数组的有效数值个数>确定,列数固定为3。
Ⅱ.将二维数组的<行数、列数、有效数值个数>插入到稀疏数组的第一行
Ⅲ.遍历二维数组,将有效数值的<行所在值、列所在值和数值本身>插入到稀疏数组

四、实现代码

二维数组转化为稀疏数组类

public class ArrayTransferUtils {
	/**
	 * 将一个二维数组转化为稀疏数组的方法
	 * 
	 * @param twoDimensionalArray 一个二维数组
	 * @return 一个稀疏数组
	 */
	public int[][] twoDimensionalArrayToSparse(int[][] twoDimensionalArray) {

		/**
		 * 获取行值,列值,有效值个数
		 * 重点:如何获取二维数组的行和列值
		 */
		int row = twoDimensionalArray.length;
		int col = twoDimensionalArray[0].length;
		int sum = 0;
		// 遍历二维数组,计算有效值个数
		for (int i = 0; i < row; i++) {
			for (int j = 0; j < col; j++) {
				if (twoDimensionalArray[i][j] != 0) {
					sum++;
				}
			}
		}
		
		//判断并输出是否存在有效值
		if (sum == 0) {
			System.out.println("数组中所有值为0,无有效值");
		} else {
			System.out.println("数组的有效个数为:" + sum+"\n");
		}
		
		/**
		 * 1.根据sum值创建稀疏数组,行:sum+1;列:3(行值、列值、值)
		 * 2.传入行值、列值、有效数字个数
		 * 3.传入有效数字的行值、列值、值
		 */
		// 1.根据sum值创建稀疏数组,行:sum+1;列:3(行值、列值、值)
		int sparseArray[][] = new int[sum + 1][3];
		
		// 2.传入行值、列值、有效数字个数
		sparseArray[0][0] = row;
		sparseArray[0][1] = col;
		sparseArray[0][2] = sum;
		
		// 3.遍历二维数组插入有效数字的行值、列值、值
		int count = 0;// 用于计算插入稀疏数组的行值
		for (int i = 0; i < row; i++) {
			for (int j = 0; j < col; j++) {
				if (twoDimensionalArray[i][j] != 0) {
					/**
					 * 每有一个有效值,插入一行
					 * 由于稀疏数组第一行已记录二维数组的行值、列值、有效值个数,所以从count+1行开始插入
					 */
					count++;
					
					sparseArray[count][0] = i;
					sparseArray[count][1] = j;
					sparseArray[count][2] = twoDimensionalArray[i][j];
				}
			}
		}
		// 遍历输出稀疏数组
		for (int[] is : sparseArray) {
			for (int i : is) {
				System.out.print(i + "\t");
			}
			System.out.println();
		}

		return sparseArray;
	}
}

主程序

public static void main(String[] args) {
		// 创建对象
		ArrayTransferUtils at = new ArrayTransferUtils();

		// 创建一个八行八列的二维数组并赋值
		int newTDArray[][] = new int[8][8];
		newTDArray[3][4] = 12;
		newTDArray[4][7] = 20;
		newTDArray[7][5] = 33;
		
		//输出到控制台查看
		for (int[] is : newTDArray) {
			for (int i : is) {
				System.out.print(i+"\t");
			}
			System.out.println();//换行
		}
		// 调用二维数组转稀疏数组方法转化并输出稀疏数组
		at.twoDimensionalArrayToSparse(newTDArray);

	}

Ending------------------------------------------------------------------------------------------------------------------------------------------------

一个转化的类,一个主程序,欢迎各位大佬来捧场,指点!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值