zoukankan      html  css  js  c++  java
  • 稀疏数组

    稀疏数组

    引入

    需求:在编写的五子棋(11*11的棋盘)程序中,有存盘退出和续上盘的功能。(使用二维数组记录棋盘)

    对应二维数组转换成稀疏数组

    分析问题:

    因为该二维数组的很多默认值是0,因此记录了很多没有意义的数据==>稀疏数组(可以对二维数组进行压缩)。其中1是黑子,2是蓝色的子。

    基本介绍:

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

    稀疏数组的处理方法是:

    1)记录数组一共有几行几列,有多少个不同的值。

    2)把具有不同值的元素的行列及值记录在一个小规模的数组(稀疏数组)中,从而缩小程序的规模。

    举例说明:(以下边数组为例)

    11*11的数组                                 ======>                                               转换成了9*3的数组

     二维数组转稀疏数组的思路

    1.遍历原始的二维数组,得到对应有效数据的个数sum

    2.根据sum就可以创建稀疏数组 int[sum+1][3]

    3.将二维数组的有效数据存入导稀疏数组

    稀疏数组转二维数组的思路

    1.先读取稀疏数组的第一行数据,创建原始的二维数组,比如上面的 Arr2=int[11][11]

    2.在读取稀疏数组的后几行数据,并赋给原始的二维数组。

    二维数组与稀疏数组的转换代码实现(以引入中的例子为例)

    package com.atguigu.sparsearray;
    
    public class SparseArray {
    
    	public static void main(String[] args) {
    		//创建一个原始的二维数组
    		//0:表示没有棋子,1表示黑子  2表示蓝子
    		int chessArr1[][]=new int[11][11];
    		chessArr1[1][2]=1;
    		chessArr1[2][3]=2;
    		//输出原始的二维数组
    		//原始的二维数组
    		for(int[] row:chessArr1) {
    			for(int data:row) {
    				System.out.printf("%d	",data);
    			}
    			System.out.println();
    		}
    		//二维数组转成稀疏数组
    		//1.先遍历二维数组,得到非零数据的个数
    //		方法1
    		int sum=0;
    		for(int i=0;i<11;i++) {
    			for(int j=0;j<11;j++) {
    				if(chessArr1[i][j]!=0) {
    					sum++;
    				}
    			}
    		}
    		System.out.println("sum="+sum);
    //		方法2
    //		int sum1=0;
    //		for(int[] row:chessArr1) {
    //			for(int data:row) {
    //				if(data!=0){
    //				sum1++;
    //				}
    //			}
    //		}
    //		System.out.println(sum1);
    		//创建对应的稀疏数组
    //		方法1
    //		int chessArr2[][]=new int[3][3];
    //		chessArr2[0][0]=11;
    //		chessArr2[0][1]=11;
    //		chessArr2[0][2]=2;
    //		chessArr2[0][0]=11;
    //		chessArr2[1][0]=1;
    //		chessArr2[1][1]=2;
    //		chessArr2[1][2]=1;
    //		chessArr2[2][0]=2;
    //		chessArr2[2][1]=3;
    //		chessArr2[2][2]=2;
    //		for(int[] row:chessArr2) {
    //			for(int data:row) {
    //				System.out.printf("%d	",data);
    //			}
    //			System.out.println();
    //		}
    		//方法2
    		//创建对应的稀疏数组
    		int sparseArr[][]=new int[sum+1][3];
    		//给稀疏数组赋值
    		sparseArr[0][0]=11;
    		sparseArr[0][1]=11;
    		sparseArr[0][2]=2;
    		
    		//遍历二维数组,将非0的值存放到稀疏数组sparseArr中
    		int count=0;//记录是第几个非零数据
    		for(int i=0;i<11;i++) {
    			for(int j=0;j<11;j++) {
    				if(chessArr1[i][j]!=0) {
    					count++;
    					sparseArr[count][0]=i;
    					sparseArr[count][1]=j;
    					sparseArr[count][2]=chessArr1[i][j];
    				}
    			}
    		}
    		//输出稀疏数组的形式
    		System.out.println();
    		System.out.println("得到的稀疏数组为~~~~");
    		for(int i=0;i<sparseArr.length;i++) {
    			System.out.printf("%d	%d	%d	",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);	
    			System.out.println();
    		}
    		//将稀疏数组-->还原成原始的二维数组
    		/*	1.先读取稀疏数组的第一行数据,创建原始的二维数组,比如上面的 Arr2=int[11][11]
    			2.在读取稀疏数组的后几行数据,并赋给原始的二维数组。
    		*/
    		//1.先读取稀疏数组的第一行数据,创建原始的二维数组
    		
    		int chessArr2[][]=new int[sparseArr[0][0]][sparseArr[0][1]];
    		
    		//2.在读取稀疏数组的后几行数据,并赋给原始的二维数组。
    		for(int i=1;i<sparseArr.length;i++) {
    			chessArr2[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
    		}
    		//输出恢复后的二维数组
    		System.out.println();
    		System.out.println("恢复后的二维数组");
    		for(int[] row:chessArr2) {
    			for(int data:row) {
    				System.out.printf("%d	",data);
    			}
    			System.out.println();
    		}
    
    
    	}
    }
    

     部分运行结果:

  • 相关阅读:
    C#学习笔记之——矩形覆盖问题
    链表,栈,队列代码
    链表练习代码
    2012年全国计算机专业大学排名
    寄存器介绍
    win8 wifi开关显示关闭,且设置里面wifi开关显示灰色的解决办法
    360随身wifi无法使用临时解决方案大全
    锐捷客户端的校园网电脑如何转化成无线路由
    未完成数据结构题目
    数据结构代码1
  • 原文地址:https://www.cnblogs.com/SpringChuXin/p/13439458.html
Copyright © 2011-2022 走看看