首页 > 编程语言 >java稀疏数组实现实例

java稀疏数组实现实例

时间:2023-04-03 14:11:21浏览次数:35  
标签:sparseArray int 稀疏 ++ 实例 数组 java originArray

没有原理讲解,仅记录一个实现代码,作为参考和笔记使用
如题,稀疏数组仅在原始数组有效数据较少的情况下起压缩空间的作用
实现过程:
首先为了方便查看和确认,封装一个打印二维数组的方法

    public static void printArray(int[][] arrays) {
        for (int[] array : arrays) {
            for (int element : array) System.out.print(element + "\t");
            System.out.println();
        }
    }

创建待压缩的原始数组

    int[][] originArray = new int[11][11];
    originArray[1][2] = 1;
    originArray[2][3] = 2;
    //输出原始数组
    printArray(originArray);

原始数组长这样:
(原始数组
可见其中存在许多0元素,浪费了许多空间,可以通过创建稀疏数组来进行压缩。


创建稀疏数组:

//首先要获取原数组中有效数据的个数,用来确定稀疏数组的大小:
    int sum = 0;
    for (int i = 0; i < originArray.length; i++) {
        for (int j = 0; j < originArray[0].length; j++) {
            if (originArray[i][j] != 0) sum++;
        }
    }
//sum即为有效数据的个数,则稀疏数组总共有sum+1行,其中第一行存放数组尺寸和有效数据个数,后续行存放有效数据坐标和值
    int[][] sparseArray = new int[sum + 1][3];
    sparseArray[0][0] = originArray.length;
    sparseArray[0][1] = originArray[0].length;
    sparseArray[0][2] = sum;
//再次遍历原数组,记录有效数据的坐标和值
    int sparseLine = 1; //标记稀疏数组的行号应从1开始,因为第"0"行用来记录数组尺寸了
    for (int i = 0; i < originArray.length; i++) {
        for (int j = 0; j < originArray[0].length; j++) {
            if (originArray[i][j] != 0) {
                sparseArray[sparseLine][0] = i;
                sparseArray[sparseLine][1] = j;
                sparseArray[sparseLine++][2] = originArray[i][j];
            }
        }
    }
//至此,稀疏数组就创建完成了,打印看一下
    printArray(sparseArray);

稀疏数组


还原数组

根据稀疏数组中记录的数组信息和有效值信息,还原数组:

//首先,根据第"0"行的信息,创建跟原数组一样尺寸的数组
    int[][] array3 = new int[sparseArray[0][0]][sparseArray[0][1]];
//从第"1"遍历稀疏数组,将记录的值还原到新数组
    for (int i = 1; i < sparseArray.length; i++)
        restoreArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
//打印看一下
    printArray(restoreArray);

还原数组

标签:sparseArray,int,稀疏,++,实例,数组,java,originArray
From: https://www.cnblogs.com/hiibird/p/17282843.html

相关文章

  • 114.二叉树展开为链表 Java
    114.二叉树展开为链表给你二叉树的根结点root,请你将它展开为一个单链表:展开后的单链表应该同样使用TreeNode,其中right子指针指向链表中下一个结点,而左子指针始终为null。展开后的单链表应该与二叉树先序遍历顺序相同。示例1:输入:root=[1,2,5,3,4,null,6]输出......
  • 详细解析Java异步线程处理队列任务工具类以及实战
    场景待入快速理解小场景描述:【一群人】来到【一个大厅】办理业务,大厅中有【多个窗口】给我们办理业务。每个人都有自己要办事情,处理过程需要消耗时间。大厅根据人群多少,开始窗口梳理。如果把“一群人”理解成一群待处理的n个【任务】,把这群人排成一个长队就形成了一个【任......
  • 最快速度求两个数组之交集算法
    该题目来自58同城的二面,用最快速度求两个数组之交集算法。比如A={6,2,4,1},B={2,9,4,3},那么A&B={2,4}。算法一:在大多数情况,也就是一般的情况下,大家都能想出最暴力的解法,通常也就是采用遍历或者枚举的办法来解决问题。该题需要找出两个数组的交集,最简单的一个办法就是用A数......
  • 【论文速递】WACV2023 - CellTranspose:用于细胞实例分割的小样本域自适应
    【论文速递】WACV2023-CellTranspose:用于细胞实例分割的小样本域自适应【论文原文】:CellTranspose:Few-shotDomainAdaptationforCellularInstanceSegmentation获取地址:https://openaccess.thecvf.com/content/WACV2023/papers/Keaton_CellTranspose_Few-Shot_Domain_Adap......
  • 【】Java Error: Port 9095 was already in use
    问题描述JavaError:Port9095wasalreadyinuse问题原因端口被占用导致解决方案Windsow系统netstat-ano|findstr9090查询到占用9090端口的进程PID为9784。tasklist|findstr9784查询到PID为0=7984的进程打开【任务管理器】->【服务】,将对应应用关闭Lin......
  • 从C#中的数组中删除指定元素的几种方法,超简单
    最近小编同事面试遇到了一道面试题,题目是有个int数组,把输入包含的指定元素删除。这道题主要考察C#基础知识和编码动手能力。小编将以如下几种方法实现,供大家参考。(注:文末还有扩展问题。)1、使用临时数组copy后替换这种方法涉及创建一个比原始数组小一个元素的新数组。然后,将原始......
  • 220602-多维数组的Jaccard指数计算
    背景:计算两个多维数据的交并商a=np.arange(0,9).reshape(-1,3)print(a)b=np.arange(4,13).reshape(-1,3)print(b)c=np.random.rand(4,3)print(c,'\n')A=np.concatenate([a,c],axis=0)B=np.concatenate([b,c],axis=0)print(A)print(B)defjaccard_ind......
  • Java 缺失的特性:扩展方法
    作者:周密(之叶)什么是扩展方法扩展方法,就是能够向现有类型直接“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改现有类型。调用扩展方法的时候,与调用在类型中实际定义的方法相比没有明显的差异。为什么需要扩展方法考虑要实现这样的功能:从Redis取出包含多个商......
  • Java 缺失的特性:扩展方法
    作者:周密(之叶)什么是扩展方法扩展方法,就是能够向现有类型直接“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改现有类型。调用扩展方法的时候,与调用在类型中实际定义的方法相比没有明显的差异。为什么需要扩展方法考虑要实现这样的功能:从Redis取出包含多个商品ID......
  • java vue获取当月第一天和最后一天,当前周一和周日
    1,vue前端,通过moment获取当月第一天和最后一天,当前周一和周日letcurrDate=moment(newDate(),"YYYY-MM-DD");varfirstDay=moment(currDate.startOf("month").valueOf()).format('YYYY-MM-DD');//获取该月份第一天的时间戳varendDay=moment(cur......