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

    稀疏数组:

     当一个数组(包括多维数组)中大部分元素为0,或者为同一个值的数组时,,为了节约空间起到压缩的效果,将数据用另一种结构来表示,即稀疏数组。
    

    稀疏数组的处理方法是:

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

    如二维数组如下
    共4行5列,其中大部分值为0,3个非0数值

    {
      0   0   6   0   0
      5   0   0   9   0
      0   0   0   0   0
      0   0   0   0   0
    }
    

    转为稀疏数组如下
    其中第一行[0][0],[0][1],[0][2]表示原始数组的行数、列数、非0的个数
    后面的3行中的每一行表示一个非0数值所在的行列及值的大小,如(0,3,6)表示原始数组的第0行第3列的值为6

    {
      4   5   3
      0   3   6
      1   0   5
      1   3   9
    }
    

    代码示例:

    public class SparseArray {
    
        public static void main(String[] args) throws IOException {
            //1、创建一个二维数组
            int[][] chessArr1 = new int[11][11];
            chessArr1[1][2] = 1 ;
            chessArr1[2][3] = 2 ;
            System.out.println("原始二维数组:");
            //记录非0的个数
            int sum = 0;
            for (int[] rows : chessArr1){
                for (int data : rows){
                    System.out.printf("%2d ",data);
                    if (data!=0)
                        sum++;
                }
                System.out.println();
            }
    
            //2、将二维数组转为稀疏数组
            //为稀疏数组赋值
            //赋值第0行
            int[][] sparseArr = new int[sum+1][3];
            sparseArr[0][0] = chessArr1.length;
            sparseArr[0][1] = chessArr1[0].length;
            sparseArr[0][2] = sum;
            //赋值其他行
            int count = 0;
            for (int i=0; i<chessArr1.length ; i++){
                for (int j=0; j<chessArr1[i].length;j++){
                    if (chessArr1[i][j] != 0){
                        count++;
                        sparseArr[count][0] = i;
                        sparseArr[count][1] = j;
                        sparseArr[count][2] = chessArr1[i][j];
    
                    }
                }
            }
            System.out.println("转换为的稀疏数组为:");
            printArray(sparseArr);
    
            //3、将稀疏数组转为二维数组
            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("转换后的二维数组为:");
            printArray(chessArr2);
    
    
    //        saveArray(sparseArr,new File("array.csv"));
    //        int[][] readArray = readArray(new File("array.csv"));
    //        System.out.println("读取文件的稀疏列表:");
    //        for (int[] line : readArray){
    //            for (int data : line){
    //                System.out.printf("%3d ",data);
    //            }
    //            System.out.println();
    //        }
        }
    
        public static void saveArray(int[][] arr,File file) throws IOException {
            String path = SparseArray.class.getResource("").getPath().substring(1);
            File saveFile = new File(path+"\"+file.getName());
            if (!saveFile.exists()){
                if(!saveFile.createNewFile()){
                    throw new RuntimeException("创建文件:"+saveFile+"失败;");
                }
            }
            //写数据
            FileWriter fw = new FileWriter(saveFile);
            for (int[] ints : arr) {
                String line = Arrays.toString(ints);
                line = line.replace(" ","");
                line = line.substring(1, line.length() - 1);
                fw.write(line + "
    ");
            }
            fw.close();
        }
    
    
        public static int[][] readArray(File file) throws IOException {
            String path = SparseArray.class.getResource("").getPath().substring(1);
            File readFile = new File(path+"\"+file.getName());
            if (!readFile.exists()){
               throw new RuntimeException("读取文件:"+readFile+"失败,文件不存在");
            }
            //读取数据
            BufferedReader br = new BufferedReader(new FileReader(readFile));
            //读取头信息
            String line = br.readLine();
            String[] strings = line.split(",");
            int lens = Integer.parseInt(strings[2]);
            int[][] retArray = new int[lens+1][3];
            retArray[0][0] = Integer.parseInt(strings[0]);
            retArray[0][1] = Integer.parseInt(strings[1]);
            retArray[0][2] = Integer.parseInt(strings[2]);
            //读取头以外的信息
            for(int count=1;count<=lens;count++){
                line = br.readLine();
                strings = line.split(",");
                retArray[count][0] = Integer.parseInt(strings[0]);
                retArray[count][1] = Integer.parseInt(strings[1]);
                retArray[count][2] = Integer.parseInt(strings[2]);
            }
            br.close();
            return retArray;
        }
    
        /**
         * 打印二维数组
         * @param array
         */
        public static void printArray(int[][] array){
            for (int[] rows : array){
                for (int data : rows){
                    System.out.printf("%2d ",data);
                }
                System.out.println();
            }
        }
    }
    

    打印结果:

    原始二维数组:
     0  0  0  0  0  0  0  0  0  0  0 
     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 
    转换为的稀疏数组为:
    11 11  2 
     1  2  1 
     2  3  2 
    转换后的二维数组为:
     0  0  0  0  0  0  0  0  0  0  0 
     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 
    
    --------------- 我每一次回头,都感觉自己不够努力,所以我不再回头。 ---------------
  • 相关阅读:
    Spring MVC 核心组件详解
    Spring MVC 入门就这一篇
    Spring 事务解决方案
    【UGUI源码分析】Unity遮罩之Mask详细解读
    游戏开发中不同时区下的时间问题
    ARTS第十三周(阅读Tomcat源码)
    Win10 电脑安装.NET低版本提示“这台计算机中已经安装了 .NET Framwork 4.6.2或版本更高的更新”问题
    Dynamics 365 Setup 提示SqlServer 存在
    Dynamics CRM "Verification of prerequisites for Domain Controller promotion failed. Certificate Server is installed."
    Dynamics CRM
  • 原文地址:https://www.cnblogs.com/zjw-blog/p/13508338.html
Copyright © 2011-2022 走看看