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

    稀疏数组

    什么是稀疏数组

    ​ 如果在一个数组中,大部分元素的值均为0(或同一值)时,传统的二维数组存储方式,会利用大量的存储空间来存放0值,从而浪费大量内存。比如说医学图像中的背景,或者一些数据转化后的特征等都会出现这种问题。

    ​ 为了解决这个问题引入了稀疏数组的概念,它是通过一个三元组的方式将非0数据保存到一个数组中,该数组即是稀疏数组。

    代码实现

    package Scanner;
    
    public class Demo4 {
        public static void main(String[] args) {
            //生成原始数组
            int[][] array = new int[11][11];
            array[1][2] = 1;
            array[2][3] = 2;
            System.out.println("输出原始数组");
    
            for(int[] arr : array){
                for(int val : arr){
                    System.out.print(val + "	");
                }
                System.out.println();
            }
    
    
            //统计原始数组中非0值的个数
            int sum = 0;
            for(int i = 0; i < array.length; i++){
                for(int j = 0; j < array[0].length; j++){
                    if(array[i][j] != 0)
                        sum++;
                }
            }
            System.out.println("非零值的个数:" + sum);
    
    
            //创建一个稀疏数组的数组, 稀疏数组的第一行为原始数组的行数,列数,非零值个数
            int [][] SparseArray = new int[sum+1][3];
            SparseArray[0][0] = array.length;
            SparseArray[0][1] = array[0].length;
            SparseArray[0][2] = sum;
    
    
            //将非零值的信息放到稀疏数组中
            //每一行存放非零值的行数,列数,值
            int cnt = 0;
            for(int i = 0; i < array.length; i++){
                for(int j = 0; j < array[i].length; j++){
                    if(array[i][j] != 0){
                        cnt++;
                        SparseArray[cnt][0] = i;
                        SparseArray[cnt][1] = j;
                        SparseArray[cnt][2] = array[i][j];
                    }
                }
            }
    
            System.out.println("输出稀疏数组");
            for(int i = 0; i < SparseArray.length; i++){
                for(int j = 0; j < SparseArray[i].length; j++){
                    System.out.print(SparseArray[i][j] + "	");
                }
                System.out.println();
            }
    
            //还原数组
            int[][] RestoreArray = new int[SparseArray[0][0]][SparseArray[0][1]];
            for(int i = 1; i < SparseArray.length; i++){
                RestoreArray[SparseArray[i][0]][SparseArray[i][1]] = SparseArray[i][2];
            }
    
            System.out.println("输出还原后的数组");
            for(int[] arr : RestoreArray){
                for(int val : arr){
                    System.out.print(val + "	");
                }
                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	
    非零值的个数:2
    输出稀疏数组
    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	
    
    Process finished with exit code 0
    
  • 相关阅读:
    在預設設定下,SQL Server 不允許遠端連接
    windows7语言包安装失败
    使一个销售组织能够销售另一个销售组织的产品
    转:多线程六种多线程方法解决UI线程阻塞
    转:BeginInvoke和EndInvoke方法 (原网址:http://www.cnblogs.com/nokiaguy/archive/2008/07/13/1241817.html)
    员工客户的统驭科目不能更改?
    公司间采购的退货(有序列号)
    排程 经典图示
    取消凭证分解 (取消公司下的多个利润中心)
    查找已删除的交货单信息
  • 原文地址:https://www.cnblogs.com/happysml/p/13813940.html
Copyright © 2011-2022 走看看