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

    稀疏数组

    1.概念

    当一个数组大部分元素为0,或者为同一值的数组时,可以使用稀疏数组表示;

    稀疏数组处理方法:

    1)记录数据有几行几列,有多少个不同的值;

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

    2.稀疏数组的举例

    3.原始数据转化为稀疏数组

    方法: 1)稀疏数组总是3列,第一行总是固定的,由原数组的行列数以及原数组中的非0个数组成;

    所以首先遍历得到原数组中的非0个数sum以及行列数,创建稀疏数组new int[sum+1][3]

    ​ 2) 遍历原数组将有效值存入稀疏数组中

    4.稀疏数组还原原数组

    方法: 1) 根据稀疏数组第一行的前两个数值创建出原数组;

    ​ 2)遍历稀疏数组将其他行的值存入原数组中;

    public class SparseArray {
    
        public static void main(String[] args) {
    
            int startArray[][] = new int[11][11];
            startArray[1][2] = 3;
            startArray[2][4] = 6;
            // 原数组转稀疏数组
            int sparse[][] = startToSparse(startArray);
            for (int[] ints : sparse) {
                for (int anInt : ints) {
                    System.out.print(anInt + " ");
                }
                System.out.println();
            }
            System.out.println("------------------------");
            // 稀疏数组转为原数组
            int[][] ints1 = SparseToStartArray(sparse);
            for (int[] ints : ints1) {
                for (int anInt : ints) {
                    System.out.print(anInt + " ");
                }
                System.out.println();
            }
        }
    
    
        /**
         * 原数组转稀疏数组
         *     row  col  val
         *  0  11   11    2     // 有效数组第一列行代表的分别为:原数组行、列、有效数字个数
         *  1  1     2    3     // 每个有效数值在原数组中的位置以及值
         *  2  2     4    6
         */
        private static int[][] startToSparse(int[][] startArray) {
            // 得到原数组中的有效数值的个数
           int sum = getSum(startArray);
            // 创建稀疏数组
            int row = sum + 1; //行
            int col = 3;
            int sparse[][] = new int[row][col];
            sparse[0][0] = startArray.length;
            sparse[0][1] = startArray[0].length;
            sparse[0][2] = sum;
            // 遍历原数组将原数组中的有效值赋值到稀疏数组
            int count = 0;
            for (int i=0;i<startArray.length;i++) {
                 for (int j=0; j<startArray[0].length; j++) {
                     if (startArray[i][j] !=0) {
                         count++;
                         sparse[count][0] = i;
                         sparse[count][1] = j;
                         sparse[count][2] = startArray[i][j];
                     }
                 }
             }
    
            return sparse;
        }
    
    
        public static int getSum(int[][] startArray) {
            int sum =0;
            for (int i=0; i<startArray.length; i++) {
                for (int j = 0; j< startArray[0].length; j++) {
                    if (startArray[i][j] != 0) {
                        sum++;
                    }
                }
            }
            return sum;
        }
    
    
        /**
         * 稀疏数组转化原数组
         * 根据稀疏数组第一行的前两个数值创建原数组
         * 循环遍历稀疏数组后几行,赋值给原数组
         */
    
        public static int[][] SparseToStartArray(int[][] sparseArray) {
            // 创建原数组
            int row = sparseArray[0][0];
            int col = sparseArray[0][1];
            int[][] startArray = new int [row][col];
    
            // 遍历稀疏数组
            for (int i=1; i<sparseArray.length;i++) {
                for (int j=0; j<3; j++) {
                    int startRow = sparseArray[i][0];
                    int startCol = sparseArray[i][1];
                    startArray[startRow][startCol] = sparseArray[i][2];
                }
            }
            return startArray;
        }
    }
    
  • 相关阅读:
    encodeURI() 的用法
    $().each() 与 $.each()区别,以及 jquery ajax 应用
    每日一乐,健康多滋味~~
    IIS部署ASP.NET MVC (4.0)网站出现的错误
    《程序员级别鉴定书》 ----中级.NET开发者
    《转》程序员必须知道的10大基础实用算法及其讲解
    C# 托管资源和非托管资源
    11、E-commerce in Your Inbox:Product Recommendations at Scale-----产品推荐(prod2vec和user2vec)
    二叉树(2)----路径
    10、Latent Relational Metric Learning via Memory-based Attention for Collaborative Ranking-----基于记忆注意的潜在关系度量协同排序
  • 原文地址:https://www.cnblogs.com/cqyp/p/14618679.html
Copyright © 2011-2022 走看看