zoukankan      html  css  js  c++  java
  • 数据结构与算法--稀疏数组

    应用场景:编写的五子棋程序,有存盘退出和继续上盘的功能

    问题分析:因为二位数组的很多默认值是0,所以记录了很多没有意义的数据

    稀疏数组(SparseArray)基本介绍

     当一个数组中**大部分元素是0或者为同一个值**时,可以使用稀疏数组保存改数组
    
      稀疏数组处理方法:
             * 记录数组一共**有多少行,有多少个不同的值**
             * 把具有不同值的元素的行列值记录在一个小规模的数组中,从而**缩小程序**的规模
    

    应用实例思路及实现

    二位数组转稀疏数组思路:

        1.遍历原始的二维数组,得到有效数据个数count
    
        2.根据count创建稀疏数组sparseArray = int[count+1][3]
    
        3.将二维数组的有效数据存入稀疏数组中
    

    稀疏数组转二位数组的思路:

         1.先读取稀疏数组的第一行,根据第一行数据创建原始的二位数组(如上:arr=int[11][11])
    
         2.再读取稀疏数组后几行的数据,并赋值给原始的二维数组
    

    代码实现:

    `

        public class SparseArray {
    
        public static void main(String[] args) {
    
        //创建一个原始的二维数组
        int[][] chessArr1 = new int[11][11];
    
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;
    
        for (int[] row : chessArr1) {
            for (int data : row) {
                System.out.print(data+" ");
            }
            System.out.println();
        }
        //将二维数组转为稀疏数组
        //1.先遍历二位数组,得到非0数据的个数
        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 sparseArr[][] = new int[sum+1][3];
    
        //给稀疏数组赋值
        sparseArr[0][0] = 11;
        sparseArr[0][1] = 11;
        sparseArr[0][2] = sum;
    
        //遍历二位数组,将非0值存放到稀疏数组
        int count = 0;//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("-------------");
        System.out.println("稀疏数组:");
    
        for (int i = 0;i < sparseArr.length;i++){
           System.out.print(sparseArr[i][0]+" 	");
            System.out.print(sparseArr[i][1]+" 	");
            System.out.print(sparseArr[i][2]+" "+"	
    ");
    
            //System.out.printf("%d	",sparseArr[0][1],sparseArr[0][1],sparseArr[0][2]);
        }
        System.out.println();
    
        //将稀疏数组恢复成二位数组
        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.print(data+" ");
            }
            System.out.println();
         }
     }}
    

    `

  • 相关阅读:
    繁体解决方案一,ASP,JSP,PHP,DotNet任何开发通用
    18.观察者模式(Observer Pattern)
    存储过程小技巧(2)从动态查询SQL中返回值给变量
    DotNet学习
    询问:有没有用C#写的C/S模式下的网页编辑工具
    dotNet繁体解决方案
    svn感叹号大全
    svn中出现红色感叹号
    Varnish配置,Error 503解决之道
    varnish清除缓存的方法
  • 原文地址:https://www.cnblogs.com/ysera-y/p/13662532.html
Copyright © 2011-2022 走看看