数据结构和算法(1)-----稀疏数组

一、实际需求

编写的五子棋程序中,有存盘退出继续上盘的功能。

数据结构和算法(1)-----稀疏数组_第1张图片

分析问题:因为该二维数组的很多值是默认值0,因此记录了很多没有意思的数据,如何在计算机中高效的存储这样的二维数组是一个需要考虑的问题。

二、基本介绍

当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。

稀疏数组的处理方法是:

  • 记录数组一共有几行几列,有多少个不同的值
  • 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模

示意图:

数据结构和算法(1)-----稀疏数组_第2张图片

三、应用实例

(1)使用稀疏数组,来保留类似前面的二维数组(棋盘,地图等等)

数据结构和算法(1)-----稀疏数组_第3张图片

(2)把稀疏数组存盘,并且可以重新恢复原来的二维数组

(3)整体思路分析

数据结构和算法(1)-----稀疏数组_第4张图片

(4)代码实现:

  • 将原始的二维数组转成稀疏矩阵,并保存在磁盘上,比如sqc.data
  • 恢复原来的数组时,读取sqc.data进行恢复
package com.atguigu.sparsearray;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class SparseArrayDemo {
	public static void main(String[] args) {
		//创建一个原始的二维数组11*11,其中0表示没有棋子,1表示黑色棋子,2表示蓝色棋子
		int [][] chessArr1=new int [11][11];
		chessArr1[1][2]=1;
		chessArr1[2][3]=2;
		
		
		//打印原始的二维数组
		System.out.println("原始的二维数组:");
		for(int i=0;i<11;i++){
			for(int j=0;j<11;j++){
				System.out.print(chessArr1[i][j]+"\t");
			}
			System.out.println();
		}
		
		
		//将二维数组转成稀疏数组
		int count=0;
		int [] x=new int [121];
		int [] y=new int [121];
		for(int i=0;i<11;i++){
			for(int j=0;j<11;j++){
				if(chessArr1[i][j]!=0){
					x[count]=i;
					y[count]=j;
					count++;
				}
			}
		}
		int [][] sparseArr=new int [count+1][3];
		sparseArr[0][0]=11;
		sparseArr[0][1]=11;
		sparseArr[0][2]=count;
		for(int i=0;i

效果图:

数据结构和算法(1)-----稀疏数组_第5张图片

数据结构和算法(1)-----稀疏数组_第6张图片

 

你可能感兴趣的:(数据结构和算法)