稀疏数组

254 阅读2分钟
  • 需求:编写五子棋游戏时,有存盘退出和续上盘的功能。
  • 问题:因为二维数组的很多值默认为0,因此记录了很多没有意义的数据。这时,就需要通过稀疏数组来解决。
  • 处理方式:1.记录数组一共有几行几列,有多少个不同。2.把不同值的元素和行列及值记录在一个小规模的-数组中,从而缩小程序的规模。
  • 如下图:

image-20200703215903031.8ffc1996.png 现在,让我们动手来实现一个稀疏数组。

1.应用实例

1)创建棋盘

  • 0:表示没有棋子
  • 1:表示黑棋
  • 2:表示白棋
		int sum=0;
		array1[1][2]=1;
		array1[2][3]=2;
		for(int i=0;i<11;++i)
		{
			for(int j=0;j<11;++j)
			{
				System.out.print(array1[i][j]+"\t");
			}
			System.out.println();
		}

2)运行结果

0	0	1	0	0	0	0	0	0	0	0	
0	0	0	2	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	

2.压缩

cjqun438dt.png

  • 左侧是原始的二维数组 10x10 = 100 个格子,右侧是稀疏数组 7 x 3 = 21 个格子

  • [0]:记录了棋盘的大小,10 行 10 列,棋盘上有 7 个不为 0 的值

  • 其他行:分别记录每一个非 0 值的所在行、所在列、值

    比如 [1]:在第 0 行第 5 列上有一个 7(这里的行列都是下标)

可以看到原始 100 个数据,压缩成 21 个数据。一定程度上压缩了数据。

  • 那么现在同样对我们在11*11的基础上进行压缩

1)获取有效值

		{
			for(int j=0;j<11;++j)
			{
				if(array1[i][j]!=0)
				{
					sum++;
				}
			}
		}

2)创建一个新的数组

		array2[0][0]=11;
		array2[0][1]=11;
		array2[0][2]=sum;
		int count=0;
		for(int i=0;i<11;++i)
		{
			for(int j=0;j<11;++j)
			{
				if(array1[i][j]!=0)
				{
					count++;
					array2[count][0]=i;
					array2[count][1]=j;
					array2[count][2]=array1[i][j];
					
				}
			}
			
		}

3.输出稀疏数组

		{
			for(int j=0;j<array2[i].length;++j)
			{
				System.out.print(array2[i][j]+"\t");
			}
			System.out.println();}
	}

输出结果

1	2	1	
2	3	2