稀疏数组

稀疏数组

稀疏数组

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


相关推荐

  • Python之pickle建议收藏

    pickle模块常用函数示例>>>[[1,1,'yes'],[1,1,'yes'],[1,0,'no'],[0

    2021年12月19日
  • bat命令详解_bat结束进程命令

    bat命令详解_bat结束进程命令批处理文件中可引用的参数为%0~%9,%0是指批处理文件的本身,也可以说是一个外部命令;%1~%9是批处理参数,也称形参;而替换形参的实参若超过了批处理文件中所规定数值(9个)且想在批处理文件中应用这些实参的话,shift命令可以帮你实现! Shift命令:更改批处理文件中可替换参数的位置 C代码    shift[/n]   n的取值是[0,8],且为整数;[/n]为可选参数,当赋予n

  • Wireshark过滤规则的使用!「建议收藏」

    Wireshark过滤规则的使用!「建议收藏」文章目录MAC地址过滤显示包含的MAC地址只显示源MAC地址只显示目标MAC地址IP地址过滤显示包含的IP地址只显示源IP地址只显示目标IP地址端口号过滤显示包含端口号为80的报文只显示源端口号为80的报文只显示目标端口号为80的报文过滤高层协议语法MAC地址过滤显示包含的MAC地址eth.addr==38:b1:db:d4:41:c5不管是源MAC地址还是目标MAC地址,只要包含38:b1:db:d4:41:c5的MAC地址都会显示出来只显示源MAC地址eth.src==38:b1:

  • vscode 使用flake8和yapf[通俗易懂]

    vscode 使用flake8和yapf[通俗易懂]vscode使用flake8和yapf

  • 免费的uml建模工具「建议收藏」

    Bullmind-uml建模工具,它是一个免费基于Web的绘图软件,支持UML,流程图,思维导图和许多其他图表类型,Bullmind-uml建模工具附带了一个功能强大且易于使用的图表编辑器,可以快速,顺畅地在线创建任何类型的图表。Bullmind-uml建模工具地址:https://www.bullmind.com/转载于:https://blog.51cto.com/14125675/2388…

  • 什么是字符串常量池_常量池中的字符串是对象吗

    什么是字符串常量池_常量池中的字符串是对象吗关于字符串与字符串常量池JDK1.8-1.9,String底层从char数组变成了byte数组,原因是部分字符仅占一个byte,而堆中含有大量的String字符串,该优化能节省较多空间。StringTable为什么要调整(移入堆内)(JDK1.6-1.7)permSize默认比较小永久代垃圾回收频率低字符串拼接操作常量与常量的拼接结果在常量池,原理是编译器优化常量池中不会存在相同内容的常量只要其中一个是变量,结果就在堆中。变量拼接的原理是StringBuilder(final不算变量)

发表回复

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

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