数据结构学习第一步---稀疏数组

学习数据结构与算法的开始

前言:写这个博客并没有别的意思,也无意于与各位大神争辩什么,只是记录一些自己的个人心得和成长过程,每次的记录也是对自己学习的总结吧,也许许多年之后再回过头来看,也是一种不错的体验呢(笑)

稀疏数组

  1. 由下五子棋的实例引出稀疏数组的概念,例如在一个11*11的棋盘上下五子棋,若需要存档,则可将每一个格子视为二维数组的元素,黑棋为1,白棋为2,空为0,然而在实际操作中,原始二维数组存在了大量的无意义且相同的元素。若一并保存则十分浪费内存。引出稀疏数组的概念,即:精简原始数组,第一行记录原始数组的行列与有意义元素的个数。后面每一行只记录元素在原始数组中的位置与大小。
    数据结构学习第一步---稀疏数组_第1张图片
    精简之后
    稀疏数组

思路

  1. 获取原始数组
  2. 遍历原始数组,获取非0元素的个数

int num=0;                                       //非零元素的个数
   	for(int i=0;i<11;i++) {                  
   		for(int j = 0;j<11;j++) {
   			if(chessArr1[i][j]!=0) {
   				num++;
   				}

3.生成稀疏数组,其中行数为num+1(第一行记录了原始数组的行列和非零元素个数),然后进行循环,将原始数组的每一个元素和0进行比较,如果不为0,则记录进稀疏数组中。这里用之前的数组中的2做例子

int count = 1;                                                       //在循环中,稀疏数组的行数
		for(int i=0;i<11;i++) {
			for(int j = 0;j<11;j++) { 
				if(chessArr1[i][j]!=0) {                        //如果原始数组中元素不为0
				sparseArr[count][0]=i;                       // i为原始数组中2这个元素的行数,记录在稀疏数组第二行第一列中
				sparseArr[count][1]=j;                       //j为原始数组中2这个元素的列数,记录在稀疏数组第二行第二列中
				sparseArr[count][2]=chessArr1[i][j];  //稀疏数组第三列用于记录元素本身
				count++;                                           //循环完成,进入稀疏数组下一行,继续记录
				}

4.从稀疏数组中还原回原始数组,根据原来的思路,稀疏数组的第一行,记录原始数组的行列数,而后,每一行的第一个元素和第二个元素都记录了该元素在原始数组中的位置,那么:

int chessArr2[][] = new int[sparseArr[0][0]] [sparseArr[0][1]];             
		for(int i = 1;i

[0][0]和[0][1]分别是11 11,即还原了行列数,sparseArr[i][0] 和 sparseArr[i][1](注意i从1开始),为 2和3,即代表了“2”这个元素在原始数组中第三行第四列的位置

5.由此已经将数组还原,今天还有一个老师布置的课后作业,将稀疏数组保存进文件中,再从文件中还原出来,目前的想法是通过FileInputStream 和 FileOutputStream还原,等待晚上具体实践。

你可能感兴趣的:(JAVA#数据结构)