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

    参考 《韩顺平数据结构和算法》

    基本介绍:

      当一个数组(此处针对二维)中大部分元素为0,或者为同一个值的数组时,可以采用稀疏数组来保存该数组。
      通常定义一个二维数组去储存数据,其中必定会有一些无效信息(可以认为是0),所以一个10*10的二维数组,即使其中只有20个有效数据,如果不进行优化,需要占用100个数据空间;如果使用稀疏数组去优化,则只需要20*3=60个数据空间。
      但如果只是一个3*3的二维数组,其中存储了6个有效数据呢?那我们就要用一个6*3的稀疏数组,显然稀疏数组不再稀疏。
      所以稀疏数组只适用于大型的二维数组

    稀疏数组处理方法:

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

    处理讲解:

    • 我们首先将二维数组中的0作为无效数据,非0值作为有效数据,
    • 然后将通过二重for循环遍历,将有效数据从二维数组中抽取出来作为稀疏数组的组成元素
    • 稀疏数组的结构为一个,n行,3列,的数组。第一行分别为原始二维数组的:行数,列数,有效值数
    • 后面的每一行对应一个有效值得信息:所在原始二维数组的行,所在原始二维数组的列,具体值

    示例:

    棋盘存盘与复盘

        public static void main(String[] args) {
    
            //一个11*11的数组,只有3个有效数据
            int[][] chessArray = new int[11][11];
            chessArray[1][2] = 1;
            chessArray[2][3] = 2;
            chessArray[4][8] = 1;
            //遍历输出11*11的数组
            for (int[] row : chessArray) {
                for(int val : row){
                    System.out.printf("%d	",val);
                }
                System.out.println();
            }
            //记录其中有效数据的个数
            int sum = 0;
            for (int i = 0; i < 11; i++) {
                for (int j = 0; j < 11; j++) {
                    if(chessArray[i][j]>0){
                        sum++;
                    }
                }
            }
            System.out.println("有效数据个数sum="+sum);
            //定义一个稀疏数组
            //数组行数为,有效数据个数+1,列数为3
            int[][] sparseArray = new int[sum+1][3];
            sparseArray[0][0] = chessArray.length;
            sparseArray[0][1] = chessArray[0].length;
            sparseArray[0][2] = sum;
            //再次遍历11*11的数组,遇到有效数据就填充到稀疏数组中
            //count可以理解为计数器
            int count = 0;
            for (int i = 0; i < 11; i++) {
                for (int j = 0; j < 11; j++) {
                    if(chessArray[i][j]>0){
                        count++;
                        sparseArray[count][0] = i;
                        sparseArray[count][1] = j;
                        sparseArray[count][2] = chessArray[i][j];
                    }
                }
            }
            System.out.println("稀疏数组为:");
            for (int[] row: sparseArray) {
                for (int val: row) {
                    System.out.printf("%d	", val);
                }
                System.out.println();
            }
    
            //从稀疏数组恢复原先的二维数组
            //读取稀疏数组的第一行,定义一个对应大小的二维数组
            int[][] chessArray_2 = new int[sparseArray[0][0]][sparseArray[0][1]];
            //遍历稀疏数组的每一行,并填充到新的二维数组
            for (int i = 1; i < sparseArray.length; i++) {
                chessArray_2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
            }
            //打印新的二维数组
            System.out.println("恢复出的二维数组:");
            for (int[] row : chessArray_2) {
                for (int val: row) {
                    System.out.printf("%d	", val);
                }
                System.out.println();
            }
        }
    

    打印输出为:
    打印内容

  • 相关阅读:
    IDL---ENVI
    IDL基础
    IDL_GUI
    .Net MVC+bootstrap Table学习
    .Net中的加密解密
    Linux服务器上安装织梦CMS
    数据仓储之DLL层接口设计
    js获取新浪天气接口
    js动态生成二维码图片
    Jquery点击发送按钮后,按钮文本倒计时
  • 原文地址:https://www.cnblogs.com/sout-ch233/p/12622429.html
Copyright © 2011-2022 走看看