Java数据结构笔记1——稀疏数组sparse array

线性结构

1.数据元素一对一
2.线性结构存储结构
顺序存储结构(常见:数组):顺序存储线性表为顺序表,存储元素地址连续
链式存储结构(常见:链表):链式存储线性表为链表,存储元素不一定连续
元素节点存放数据元素相邻元素地址信息
线性结构常见:数组、队列、链表和栈
分清逻辑结构和存储结构:如,链表是线性结构链式存储

非线性结构

非线性结构包括:二维数组,多维数组,广义表,树结构图结构

稀疏数组(sparse array)

当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
1.记录数组一共有几行几列,有多少个不同的值
2.把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模(这个小规模数组就是sparse array)
实例
棋盘
Java数据结构笔记1——稀疏数组sparse array_第1张图片
Java数据结构笔记1——稀疏数组sparse array_第2张图片
黑棋值1,蓝值2
sparse array第一行写共几行几列和有胸啊数据个数,之后写内部不同位置和值
在这里插入图片描述
再通过sparse array反推回原来数组
整理:
原始——>sparse
1.遍历 原始二维数组,得到有效数据个数sum
2.根据sum创建sparseArr int[sum+1][3]
3.有效数据存入sparse array
4.sparse array存入磁盘中(io部分内容)
sparse——>原始
1.读磁盘sparse array,读第一行,根据第一行创建二维数组,chessArr2=int [11][11]
2.读取后几行数据,赋值给原始二维数组

实战

1.原数组

Java数据结构笔记1——稀疏数组sparse array_第3张图片
没赋值default为0

2.后遍历二维数组得到非零数个数sum

		int sum=0;
		for(int i=0;i<chessArr.length;i++) {
			for(int j=0;j<11;j++) {
				if(chessArr[i][j]!=0)sum++;
			}
		}
		System.out.print("sum="+sum);

可以看到chessArr.length就是11

3.构建sparse Array

int sparseArr[][]=new int[sum+1][3];
		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<11;j++) {
				if(chessArr[i][j]!=0) {
					count++;
					sparseArr[count][0]=i;
					sparseArr[count][1]=j;
					sparseArr[count][2]=chessArr[i][j];
				}
			}
		}
		System.out.println();

输出sparseArr验证

System.out.println("sparse array");
for(int i=0;i<sparseArr.length;i++) {
	for(int j=0;j<3;j++) {
		System.out.printf("%d\t",sparseArr[i][j]);
	}
	System.out.println();
}

输出结果

4.从sparse array复原成chessArr2并输出

int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
for(int i=1;i<sparseArr.length;i++) {
	chessArr2[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
}
System.out.println();
for(int[] row:chessArr2) {
	for(int data:row) {
		System.out.printf("%d   ",data);
	}
	System.out.println();
}

你可能感兴趣的:(算法,稀疏数组,Java)