浅谈Java数据结构之稀疏数组知识总结

浅谈Java数据结构之稀疏数组知识总结

稀疏数组的定义

稀疏数组是指当一个数组中大部分元素是相同的值时,可以使用稀疏数组来保存该数组。稀疏数组的必要性在于节省内存空间,当数组中元素过多时,存储数组所需的内存空间也呈指数级增长。

稀疏数组的特点

  1. 稀疏数组存储的是一个原始的二维数组。
  2. 稀疏数组的第一行保存原始数组的基本信息,包括行数、列数、有效值的个数。
  3. 稀疏数组的每一行保存一个有效的数据信息,包括该元素所在行数、列数以及该元素的值。

稀疏数组的应用场景

稀疏数组的应用场景很多,以下是两个实践案例。

  1. 棋盘问题
    如果一个棋盘中有N个子,且大多数子都是0,那么这个棋盘的数组可以使用稀疏数组来存储。保存该棋盘所消耗的内存空间明显小于保存该棋盘的数组所需的空间。

下面的代码示例演示了如何将一个棋盘转换成稀疏数组以及如何将稀疏数组还原成一个棋盘:

public class SparseArray {

    public static void main(String[] args) {
        // 原始棋盘
        int[][] chessArr = new int[11][11]; 
        chessArr[1][2] = 1;
        chessArr[2][3] = 2;
        chessArr[4][5] = 2;
        // 输出原始棋盘
        for (int[] row : chessArr) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }
        // 转换成稀疏数组
        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;
        // 遍历原始数组,并将非零元素保存到稀疏数组中
        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) {
            System.out.printf("%d\t%d\t%d\n", row[0], row[1], row[2]);
        }
        // 将稀疏数组还原成原始数组
        int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
        for (int i = 1; i < sparseArr.length; i++) {
            chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }
        // 输出还原后的原始数组
        System.out.println("还原后的原始数组为:");
        for (int[] row : chessArr2) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }
    }
}
  1. 历史文件记录
    稀疏数组还可以应用于记录历史文件,比如著名的UNIX系统中,记录用户使用情况的wtmp文件。这个文件保存进入系统和退出系统的时间、用户名、终端号等信息。一般情况下,这些记录都是空的,只有在有用户进入和退出系统的时候才会进行记录。将这个文件记录成稀疏数组,可以大大节省存储空间。

稀疏数组的注意事项

  1. 稀疏数组也是一个二维数组,平时使用时需要特别注意行列顺序。
  2. 稀疏数组的第一行必须保存原始数组的基本信息,否则无法完整还原原始数组。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈Java数据结构之稀疏数组知识总结 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 【ACM博弈论】SG函数入门(1):从巴什博奕到尼姆游戏

    在我小时候以前做题的时候,遇到博弈题往往都是漫无目的地打表找规律,或者找一些特殊情况但是没有很好的分析方法。 其实博弈题是有比较套路的解题方法的,那就是利用SG函数,第一节不会讲到SG函数的具体用法,我们先来博弈入个门,学习一下最基本的博弈类型:Nim游戏。 ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式…

    算法与数据结构 2023年4月17日
    00
  • redis中hash数据结构及说明

    Redis中Hash数据结构及说明 简介 Redis中的Hash是一个string类型的field和value的映射表,可以将多个键值对存储在一个数据结构中,适合于存储对象。 通过HASH数据结构,我们可以方便的对单个field进行增删改查操作,增加了程序编写的方便性。 命令 以下是Hash数据结构的基础命令: HSET 将哈希表 key 中的域 field…

    数据结构 2023年5月17日
    00
  • C语言中关于树和二叉树的相关概念

    C语言中关于树和二叉树的相关概念 树的概念 在计算机科学中,树是一种非常常见的数据结构,它由一组节点(通常称为元素)和一组连接节点的边组成。树是一种无向的、连通的、无环的图形结构,其中有一个节点被称为根节点,它没有父节点,而其他节点都有一个父节点。 树的定义很抽象,但在程序设计中,我们通常会使用一个节点类来实现树结构。一个节点类通常包含两个元素:一个是表示当…

    数据结构 2023年5月17日
    00
  • TypeScript数据结构栈结构Stack教程示例

    下面就给您详细讲解一下“TypeScript数据结构栈结构Stack教程示例”的完整攻略。 1. 栈结构(Stack)概述 栈是一种特殊的数据结构,它的特点是后进先出(Last In First Out,LIFO)。和数组不同的是,栈只能在栈顶插入和删除元素。栈的常见操作有“- push() 元素入栈,将元素放到栈顶- pop() 元素出栈,从栈顶取出元素…

    数据结构 2023年5月17日
    00
  • 数据结构 红黑树的详解

    数据结构:红黑树的详解攻略 一、红黑树的定义 红黑树是一种二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是红色或黑色。红黑树的特征是对于任何有效的红黑树,从根到叶子结点或空子结点的每条路径都包含相同数目的黑色结点。 二、插入操作 对于新插入的节点,将其涂红并插入红黑树中,然后按照二叉搜索树的规则将其插入到红黑树中。 如果父节点是黑色,则不需…

    数据结构 2023年5月17日
    00
  • 数据结构之堆详解

    数据结构之堆详解 什么是堆? 堆(Heap)是一种特殊的树形数据结构。堆具有以下两个特点: 堆是一颗完全二叉树; 堆中每个节点的值都必须大于等于或小于等于其左右子节点的值,分别称作大根堆和小根堆。 上述的大根堆和小根堆其实是两种不同的堆的实现方式。对于大根堆,每个节点的值都比其左右子节点的值要大;小根堆则相反,每个节点的值都比其左右子节点的值要小。 堆的基本…

    数据结构 2023年5月17日
    00
  • JS数据结构之队列结构详解

    JS数据结构之队列结构详解 什么是队列结构? 队列结构是一种遵循先进先出(FIFO)原则的线性数据结构,它可以用来存储一系列待处理的数据,其中队首是最先进入队列的元素,队尾是最后进入队列的元素。 在队列中,添加元素的操作叫做enqueue,移除元素的操作叫做dequeue。同时,队列还包括peek方法,查看队列头的元素,以及isEmpty方法,判断队列是否为…

    数据结构 2023年5月17日
    00
  • 数据结构 – 绪论

    01.绪论 1. 概念 1.1 数据结构 数据 Data:信息的载体。能被计算机识别并处理的符号的集合。 数据元素 Data element:数据的基本单位,通常作为一个整体进行考虑和处理。一个数据元素往往由若干数据项组成。数据项是组成数据元素的不可分割的最小单位。 如学生的信息记录就是一个数据元素,它由学号、姓名、性别等组成。 数据对象 Data obje…

    算法与数据结构 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部