稀疏数组

稀疏数组

稀疏数组

稀疏数组就是数组中,大部分的元素值都未被使用(或都为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");
        }
    }
}

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

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

(0)
上一篇 2021年7月8日 上午11:00
下一篇 2021年7月8日 下午12:00


相关推荐

  • 微信小程序bindtap 与 catchtap 是使用

    微信小程序bindtap 与 catchtap 是使用如果写小程序对二者不理解的 那看到这边博客 将很快帮助到您 个人总结的一句话 bindtap 点击事件在同一个 view 中会向上冒泡 而 catchtap 不会向上冒泡下面会有一个 demo 给出解释 说他们使用的时候先说下微信小程序的事件分类冒泡事件与非冒泡事件官网上这样规定的事件分类事件分为冒泡事件和非冒泡事件 冒泡事件 当一个组件上的事件被触发后 该事件会向父节点传递

    2026年3月18日
    2
  • 分辨率,像素,像素密度易懂

    分辨率,像素,像素密度易懂分辨率是什么?一般会说这个屏幕的分辨率是1920*1080,这就说明纵向和横向上有1920个和1080个像素点;像素点是什么?一个像素点就是一个色彩块,没有实际的物理尺寸;什么是屏幕像素密度?一英寸长的一条线上理论上会有多少个像素点;例如:一个手机长边有1920个像素点,短边有1080个像素点,屏幕大小(对角线的物理大小)是5.2英寸的,那么屏幕密度是怎么计…

    2022年5月4日
    63
  • java socket通讯中文乱码问题

    java socket通讯中文乱码问题话不多说上代码publicvoidrun(){//客户端一连接就可以写数据给服务器了newsendMessThread().start();super.run();try{//读Sock里面的数据InputStreams=socket.getInputStream();byte[]buf=newbyte[1024];

    2022年7月26日
    22
  • jenkins拉取gitlab代码_jenkins配置git自动部署

    jenkins拉取gitlab代码_jenkins配置git自动部署前言python自动化的脚本开发完成后需提交到git代码仓库,接下来就是用Jenkins拉取代码去构建自动化代码了新建项目打开Jenkins新建一个自由风格的项目源码管理Repository

    2022年7月28日
    10
  • Linux修改文件名(mv和rename)

    Linux修改文件名(mv和rename)1 mv 命令 mvfile1file2 把当前目录下的 file1 文件名改成 file2 如果该目录下有 file2 则覆盖以前的 file2 文件 2 rename 命令 rename 命令支持批量修改文件名 1 批量更改目录下所有文件的后缀名 命令格式如 rename s c cpp 2 批量把目录下所有文件名包含大写部分修改为小写 命令格式 rename y A Z a z 反着写就是小写变大写 3 删除目前下所有文件的后缀名命令格式 rename s CP

    2026年3月17日
    3
  • UDP flood攻击_udp攻击是什么意思

    UDP flood攻击_udp攻击是什么意思UDPFlood是日渐猖厥的流量型DoS攻击,原理也很简单。常见的情况是利用大量UDP小包冲击DNS服务器或Radius认证服务器、流媒体视频服务器。100kpps的UDPFlood经常将线路上的骨干设备例如防火墙打瘫,造成整个网段的瘫痪。由于UDP协议是一种无连接的服务,在UDPFLOOD攻击中,攻击者可发送大量伪造源IP地址的小UDP包。但是,由于UDP协议是无连接性的,所以只要开了一个UDP的端口提供相关服务的话,那么就可针对相关的服务进行攻击。…

    2026年4月14日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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