稀疏数组

稀疏数组

稀疏数组

稀疏数组就是数组中,大部分的元素值都未被使用(或都为0),在数组中仅有少 部分的空间使用。因此造成内存空间的浪费,为了解决这问题,并且不影响数组中原 有的元素值,我们采用了一种压缩的方式来 表示稀疏数组的内容。 如图二维数组所示,有大部分的空间是无用的。

在这里可以使用稀疏数组进行压缩。其中在稀疏数组中第一部分所记录的是原数组的列数和行数以及元素使用的个数、第二部分所记录的是原数组中元素的位置和内容。经过压缩之后,原来需要声明大小为63的数组,而使用压缩后,只需要声明大小为6*3的数组,仅需18个存储空间。

代码实现

将二维数组变成稀疏数组

public class SparseArray {
    private static final int row = 9;
    private static final int col = 7;
    public static void main(String[] args) {
        // 创建一个原始的二维数组
        int arr[][] = new int[row][col];
        arr[1][1]=3;
        arr[3][0]=1;
        arr[3][1]=4;
        arr[4][2]=7;
        arr[5][5]=5;
        System.out.println("输入原始二维数组-----------------");
        prt(arr);
        System.out.println("-------------------------------");

        // 将二维数组变成稀疏数组
        // 遍历得到非零数据个数
        int sum=0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if(arr[i][j]!=0){
                    sum++;
                }
            }
        }
        // 创建对应稀疏数组
        int sparse[][] = new int[sum+1][3];
        // 给稀疏数组赋值
        sparse[0][0] = arr.length;
        sparse[0][1] = arr[0].length;
        sparse[0][2] = sum;

        // 遍历二维数组。将非零值存放到稀疏数组
        int count =0; // 用于记录第几个非零
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if(arr[i][j]!=0){
                    count++;
                    sparse[count][0] = i;
                    sparse[count][1] = j;
                    sparse[count][2] = arr[i][j];
                }
            }
        }
        // 输出稀疏数组
        System.out.println("输出稀疏数组");
        prt(sparse);

        // 将稀疏数组还原成二维数组
        int arr2[][] =new int[sparse[0][0]][sparse[0][1]];
        for (int i = 1; i <sparse.length ; i++) {
            arr2[sparse[i][0]][sparse[i][1]] = sparse[i][2];
        }
        System.out.println("输出还原的二维数组");
        prt(arr2);
    }
    public static void prt(int [][] arr ){
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j]+" ");
            }
            System.out.println("\n");
        }
    }
}

复制代码
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/100883.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • offset偏移量_如何调用结构体

    offset偏移量_如何调用结构体一、函数原型#include<stddef.h>size_toffsetof(type,member);offsetof原型定义:defineoffsetof(t,m)((size_t)&((t*)0)->m)1、关于&((t*)0)的解释1-1:(type*)0作用是强制类型转换,将0转换为(type*)类型,一个type指针类型1-2:编译器在会将&((t*)0)优化为直接取地址,因为这种表达是:先访问空间,再取空间的

  • smb服务配置

    smb文件共享:用internet文件系统(CIFS)也称为服务器是适用于MicrosoftWindows服务器和客户端的标准文件和打印共享系统模块。Samba服务可用于将Linux文件系统作为CIFS/SMB网络文件共享进行共享,并将Linux打印机作为CIFS/SMB打印机共享进行共享。实验一、windows共享文件给linux1、实验环境1)、windows系统172.25.254…

  • 第七期 思科【cisco】命令

    第七期 思科【cisco】命令

  • BZOJ 1968: [Ahoi2005]COMMON 约数研究(新生必做的水题)

    BZOJ 1968: [Ahoi2005]COMMON 约数研究(新生必做的水题)

  • Burp Suite抓包、截包和改包「建议收藏」

    Burp Suite抓包、截包和改包「建议收藏」条件:本地网络使用代理,由BurpSuite来代理。也就是说,每个流出外网的web数据包都必须经过BurpSuite,她想动你的数据包,你说可以不?0、配置本地网络代理配置:Windows下,打开IE——&gt;设置——&gt;Internet选项——&gt;连接——&gt;局域网设置(L)——&gt;代理服务器下勾选“为LAN使用代理服务器”,地址:127.0.0.1,端口:8080Bur…

  • 复制粘贴不到远程桌面_远程桌面无法复制到本地

    复制粘贴不到远程桌面_远程桌面无法复制到本地在远程服务器上打开任务管理器,在进程里面找到rdpclip进程(或者剪贴板监视器),点击“结束进程”打卡DOS命令符,输入rdpclip后,确认,从新打开远程剪贴服务。

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号