java数据结构之稀疏数组

喜你入骨 提交于 2020-01-24 22:18:19

java数据结构之稀疏数组

前言

前段时间在讨论群里面,有个大佬说学这种算法没用,实际的开发并不会用到。但是我还是愿意去学习这种学而无用的知识(当然能用到是最好不过啦),因为学习学的是一种解题思路,思路有了,自然而然问题也就解决了。
~回归正传,简单的介绍一下稀疏数组。通俗的来讲,稀疏数组就是一个n*3的矩阵,它能够将一些特殊的矩阵的规模缩小,从而大大的节省了存储空间。

1 稀疏数组的一些约定(硬性要求)

(1)第一行(三列):

第一列 第二列 第三列
特殊矩阵有多少行 有多少列 有多少个不为0的元素

(2)从第二行往后开始:
存放特殊矩阵中不为0的元素

第一列 第二列 第三列
元素的行 元素的列 元素的值

2 特殊矩阵

这里的特殊数组指的是矩阵的元素大部分为0(或者大部分为同一个值)的元素
例如 :
0,0,1,2
0,0,0,1
2,0,0,0

3 特殊矩阵转成稀疏数组

3.1 先看效果图

(1)特殊矩阵:
在这里插入图片描述(2)转换成的稀疏数组
在这里插入图片描述

3.2 代码演示

~代码演示之前,说点废话,看到矩阵的话,大家应该能够条件反射出二维数组。简单的来说,这里就是把一些特殊的二维数组,转化成符合特定要求的二维数组(稀疏数组)。


上代码(这里用五子棋盘进行演示)
		// 定义一个棋盘 11*11
		int[][] chessArr = new int[11][11];

		chessArr[1][2] = 1;
		chessArr[2][3] = 2;
		// 输出原始的棋盘
		for (int[] row : chessArr) {
			for (int data : row) {
				System.out.printf("%d\t", data);
			}
			System.out.println();
		}

		// 将二维数组转换成稀疏数组
		// 数组中不为0元素的个数
		int sum = 0;
		for (int[] row : chessArr) {
			for (int data : row) {
				if (data != 0) {
					sum++;
				}
			}
		}
		// System.out.println("sum="+ sum);
		// 二维数组转稀疏数组
		int[][] sparseArr = new int[sum + 1][3];
		// 稀疏数组的第一行数据 原始数组的行 原始数组的列 原始数组中元素不为0的个数
		sparseArr[0][0] = 11;
		sparseArr[0][1] = 11;
		sparseArr[0][2] = sum;
		// 向稀疏数组中进行赋值
		// 定义一个计数器
		int count = 0;
		for (int i = 0; i < chessArr.length; i++) {
			for (int j = 0; j < chessArr[i].length; j++) {
				if (chessArr[i][j] != 0) {
					count++;
					sparseArr[count][0] = i;
					sparseArr[count][1] = j;
					sparseArr[count][2] = chessArr[i][j];
				}
			}
		}
		System.out.println();
		// 输出稀疏数组
		System.out.println("得到的稀疏数组是");
		for (int i = 0; i < sparseArr.length; i++) {
			System.out.printf("%d\t%d\t%d\t", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
			System.out.println();
		}

4 稀疏数组转换成二维数组

4.1 直接上代码(接上面代码)
		// 稀疏数组在转成二维数组
		// 定义二维数组
		int[][] chessArray2 = new int[sparseArr[0][0]][sparseArr[0][1]];
		// 遍历二维数组
		for (int i = 1; i < sparseArr.length; i++) {
			chessArray2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
		}

		// 输出恢复后的二维数组
		System.out.println();
		System.out.println("输出恢复后的二维数组");
		for (int row[] : chessArr) {
			for(int data :row ) {
				System.out.printf("%d\t",data);
			}
			System.out.println();
		}

	}
4.2 输出结果

需要转换的稀疏数组:
在这里插入图片描述
转换成的二维数组:
在这里插入图片描述

5总结

(1)到这里就结束了,这一小结主要是分享了稀疏数组和特殊二维数组之间的相互转换问题(自我感觉挺鸡肋的)。
(2)不要说这个东西没用,咱学的是套路,套路多了,解决问题的方法就多了。新手上路,不足之处还请大家指出来,共同进步纯手打,希望分享的这点经验能够帮助到大家。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!