数据结构与算法之稀疏数组与二维数组转换
发布日期:2021-05-10 14:35:05 浏览次数:21 分类:精选文章

本文共 2910 字,大约阅读时间需要 9 分钟。

稀疏数组(Sparse Array)是一种优化后的数据结构,特别适用于存储具有大量零元素的二维数组。现代计算机中,内存是不可逆的资源,稀疏数组通过减少存储零元素的空间,提高了内存利用效率,避免由于大量零元素占用内存而浪费资源的问题。

稀疏数组的结构

稀疏数组是一个由多行组成的数组。第一行为元数据,包含三个元素:

  • 原始数组的行数(rows)
  • 原始数组的列数(cols)
  • 原始数组中非零元素的总个数(sum)

后面的每一行依次记录原始数组中的非零元素,包含以下三个信息:

  • 原始数组中的行索引(i)
  • 原始数组中的列索引(j)
  • 对应元素的值(value)

例如,如果原始数组是一个11x11的棋盘,其中有两个非零元素分别位于(1,2)和(2,3)、(3,4),那么稀疏数组的结构如下:

  • 第一行:11, 11, 3
  • 第二行:1, 2, 1
  • 第三行:2,3,2
  • 第四行:3,4,2

###이드疏数组的转换思路

二维数组转稀疏数组

  • 计算非零元素总数(sum): 遍历原始二维数组,统计其中所有非零元素的个数。可以使用双重循环遍历每个元素,如果元素不为零,则增加计数器。

  • 初始化稀疏数组: 根据计算得到的sum,创建稀疏数组,其行数为sum+1,列数为3。第一行存储原始数组的元数据,后面的行依次存储非零元素的位置和值。

  • 填充稀疏数组: 遍历原始二维数组,将每个非零元素的i,j和值依次存入稀疏数组中。注意记录稀疏数组的行号,每处理一个非零元素,行号增加1。

  • 稀疏数组转二维数组

  • 初始化原始二维数组: 根据稀疏数组的第一行元数据,创建二维数组。行数等于稀疏数组的第一行的rows值,列数等于cols值。

  • 填充原始数组: 遍历稀疏数组,除了第一行之外,每一行存储非零元素的i,j和值。按照i和j的值,将对应的值赋予原始二维数组中的位置。

  • 代码实现

    package com.datastrucate.sparsearray;
    public class SparseArray {
    public static void main(String[] args) {
    // 二维数组例子,棋盘位置,1代表黑子,2代表白子,0代表空位
    int[][] chessArr = new int[11][11];
    chessArr[1][2] = 1; // (1,2) 位置有黑子
    chessArr[2][3] = 2; // (2,3) 位置有白子
    chessArr[3][4] = 2; // (3,4) 位置有白子
    // 计算非零元素个数
    int sum = 0;
    for (int i = 0; i < 11; i++) {
    for (int j = 0; j < 11; j++) {
    if (chessArr[i][j] != 0) {
    sum++;
    }
    }
    }
    // 创建稀疏数组
    int[][] sparseArr = new int[sum + 1][3];
    // 初始化稀疏数组第一行
    sparseArr[0][0] = 11; // 原始行数
    sparseArr[0][1] = 11; // 原始列数
    sparseArr[0][2] = sum; // 非零元素个数
    // 填充稀疏数组,每行依次存储非零元素的i、j和值
    int count = 0;
    for (int i = 0; i < 11; i++) {
    for (int j = 0; j < 11; j++) {
    if (chessArr[i][j] != 0) {
    count++;
    sparseArr[count][0] = i;
    sparseArr[count][1] = j;
    sparseArr[count][2] = chessArr[i][j];
    }
    }
    }
    // 输出稀疏数组
    System.out.println("稀疏数组内容");
    for (int[] row : sparseArr) {
    for (int value : row) {
    System.out.print(value + " ");
    }
    System.out.println();
    }
    // 稀疏数组转二维数组
    int[][] recoveredArr = new int[sparseArr[0][0]][sparseArr[0][1]];
    // 填充恢复后的数组
    for (int i = 1; i < sparseArr.length; i++) {
    int row = sparseArr[i][0];
    int col = sparseArr[i][1];
    int value = sparseArr[i][2];
    recoveredArr[row][col] = value;
    }
    // 输出恢复后的二维数组
    System.out.println("恢复后的二维数组");
    for (int[] arr : recoveredArr) {
    for (int value : arr) {
    System.out.print(value + " ");
    }
    System.out.println();
    }
    }
    }

    总结

    稀疏数组通过存储元数据和仅记录非零元素的位置和值,有效地减少了内存占用。对于存储大量零元素的二维数组来说,这种结构非常有用。通过上述代码,可以实现二维数组到稀疏数组的转换,以及反过来稀疏数组到二维数组的还原。这对优化内存使用具有重要意义,特别是在处理大型数据集时。

    上一篇:Linux命令语法
    下一篇:Verilog 位拼接运算符{}语法要点总结

    发表评论

    最新留言

    初次前来,多多关照!
    [***.217.46.12]2025年05月06日 02时57分07秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章

    kali安装docker(亲测有效) 2023-01-23
    Linux系列:Linux目录分析:[/] + [/usr] + [/usr/local] + [/usr/local/app-name]、Linux最全环境配置 + 动态库/静态库配置 2023-01-23
    mysql系列:远程连接MySQL错误“plugin caching_sha2_password could not be loaded”的解决办法 2023-01-23
    Nmap端口服务 之 CentOS7 关于启动Apache(httpd)服务、telnet服务、smtp服务、ftp服务、sftp服务、snmp服务 2023-01-23
    PHP系列:PHP 基础编程 2(时间函数、数组---实现登录&注册&修改) 2023-01-23
    PHP系列:使用PHP实现登录注册功能的完整指南 2023-01-23
    Python&aconda系列:cmd/powershell/anaconda prompt提示“系统找不到指定的路径”(亲测有效) 2023-01-23
    Python&aconda系列:(W&L)Conda使用faiss-gpu报错及解决办法、安装numpy的坑、cmd执行Python脚本找不到第三方库、安装tensorflow-gpu时遇到的from 2023-01-23
    python&anconda 系列:Pycharm在debug问题的N种解决方案(一般程序、web方向、人工智能方向) 2023-01-23
    python&anconda系列(亲测有效):tensorflow AttributeError: ‘str’ object has no attribute ‘decode’ 2023-01-23
    python&anconda系列:tf.keras.backend.get_session()和keras.backend.get_会话()返回不同的会话对象(待解答) 2023-01-23
    "WARNING: Increasing RAM size to 1GB" and "Cannot set up guest memory 'xxx.ram': Invalid argument". 2023-01-23
    #if 0 #elif 1 #else #endif 用法 2023-01-23
    (反射+内省机制的运用)简单模拟spring IoC容器的操作 2023-01-23
    (转)tomcat7.0 manager app和host manager web管理 2023-01-23
    .Net(C#)实现异步编程 2023-01-23
    .Net中webBrowser控件JS交互 2023-01-23
    .Net中webBrowser控件指定IE版本 2023-01-23
    02-Docker镜像分类及操作秘籍,轻松掌握导出、导入、删除 2023-01-23
    04-docker-commit构建自定义镜像 2023-01-23