java数据结构基础:稀疏数组

Java数据结构基础:稀疏数组

在开发过程中,我们需要处理一些稀疏矩阵(大部分元素为0)的数据。这时候,使用稀疏数组是比较高效的方法。

什么是稀疏数组

稀疏数组是由很多元素值相同的元素组成,这些元素的值通常为0。而这些值不同时都存储在一个数组中会浪费很多内存空间。因此,我们使用稀疏数组来存储这些元素。

稀疏数组的定义:

稀疏数组的行数可以理解为矩阵的行数,而列数可以理解为矩阵的列数,也可以理解为原数组的元素个数,而值则是原数组中非0元素的值。

稀疏数组的例子

现在我们通过一个具体的例子来理解一下稀疏数组。

int[][] myArray = new int[11][11];
myArray[1][2] = 1;
myArray[2][3] = 2;

上面的代码创建了一个11*11的数组,并且将(1,2)的坐标值赋为1,将(2,3)的坐标值赋为2。现在我们将这个数组转换成稀疏数组。

int count = 0;
for (int i = 0; i < 11; i++) {
    for (int j = 0; j < 11; j++) {
        if (myArray[i][j] != 0) {
            count++;
        }
    }
}
int[][] sparseArray = new int[count + 1][3];
sparseArray[0][0] = 11; 
sparseArray[0][1] = 11;
sparseArray[0][2] = count;
int sparseArrayIndex = 1; 
for (int i = 0; i < 11; i++) {
    for (int j = 0; j < 11; j++) {
        if (myArray[i][j] != 0) {
            sparseArray[sparseArrayIndex][0] = i;
            sparseArray[sparseArrayIndex][1] = j;
            sparseArray[sparseArrayIndex][2] = myArray[i][j];
            sparseArrayIndex++;
        }
    }
}

上述代码将原数组转换成了稀疏数组,数组的第一维表示当前行的坐标,第二维表示当前列的坐标,第三维表示当前值。

这里的稀疏数组为:

11 11 2
1  2  1
2  3  2

稀疏数组的读取

从稀疏数组中读取原数组的值,只需要将稀疏数组再转换成原数组。

int[][] myArray2 = new int[sparseArray[0][0]][sparseArray[0][1]];
for (int i = 1; i <= sparseArray[0][2]; i++) {
    myArray2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}

上述代码通过循环将稀疏数组中的值写入到新的数组中,最后的数组即为原数组。

总结

稀疏数组是一种对于大部分元素为0的矩阵高效存储方法。通过稀疏数组的定义、例子和读取方法,我们可以更好的了解它的应用场景和使用方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java数据结构基础:稀疏数组 - Python技术站

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

相关文章

  • C++数据结构与算法的基础知识和经典算法汇总

    C++数据结构与算法的基础知识和经典算法汇总 1. 基础知识 1.1 数据结构 数据结构是计算机存储、组织数据的方式。这里列出常见的数据结构,包括但不限于: 数组 链表 栈 队列 树 哈希表 1.2 算法 算法是解决问题的步骤和方法。下列是常见的算法: 排序算法 查找算法 字符串算法 图算法 1.3 复杂度 复杂度是算法性能的度量。常见的复杂度表示法有O(n…

    数据结构 2023年5月17日
    00
  • Java实题演练二叉搜索树与双向链表分析

    Java实题演练二叉搜索树与双向链表分析 题目描述 给定一个二叉搜索树,将它转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 思路分析 对于一颗二叉搜索树,有以下性质: 若左子树不为空,则左子树上所有结点的值均小于它的根结点的值; 若右子树不为空,则右子树上所有结点的值均大于它的根结点的值; 左右子树也为二叉搜索树。 我们考虑…

    数据结构 2023年5月17日
    00
  • Go语言数据结构之希尔排序示例详解

    Go语言数据结构之希尔排序示例详解 希尔排序简介 希尔排序,也称为缩小增量排序,是插入排序的一种更高效的改进版本;希尔排序是非稳定排序算法。 希尔排序的基本思想是已距离进行“减半”的插入排序;先将整个待排序的记录序列分割成若干个子序列,分别进行直接插入排序,待各子序列中的记录基本有序时,再将子序列合并为整体有序序列。 希尔排序的过程 从上面的简介中我们可以得…

    数据结构 2023年5月17日
    00
  • C语言超详细讲解数据结构中的线性表

    C语言超详细讲解数据结构中的线性表完整攻略 线性表的概念和基本操作 线性表是指由同类型的数据元素构成的有限序列。即每个数据元素只有一个前驱和一个后继。线性表通常用于表示一维数组、列表、队列等数据结构。 线性表的基本操作包括: 初始化操作:创建一个空的线性表。 插入操作:在线性表中插入一个元素。 删除操作:删除线性表中的一个元素。 查找操作:查找线性表中是否存…

    数据结构 2023年5月17日
    00
  • C++实现LeetCode(211.添加和查找单词-数据结构设计)

    首先,我们需要先了解一下题目的要求和限制,以及具体的解题思路。 题目描述 设计一个支持添加、删除、查找单词的数据结构。添加和删除单词的操作需要支持普通词和通配符’.’。查找单词只支持普通词,不支持通配符’.’。所有单词都是非空的。 解题思路 这道题可以使用前缀树(Trie树)来实现。 首先,我们需要定义一个单词类,它包含两个字段:单词字符串和单词长度。然后,…

    数据结构 2023年5月17日
    00
  • C语言线性表全面梳理操作方法

    C语言线性表全面梳理操作方法 线性表概述 线性表是一种常用的数据结构,是指数据元素之间存在一定逻辑顺序,每个元素都有唯一的前驱和后继。 线性表有两种存储方式: 顺序存储结构 和 链式存储结构。 顺序存储结构 顺序存储结构是指采用顺序存储方式存储线性表,即将线性表的元素依次存储在一段连续的存储空间内。 代码示例:创建顺序存储线性表 #define MaxSiz…

    数据结构 2023年5月17日
    00
  • Java数据结构之链表的增删查改详解

    Java数据结构之链表的增删查改详解 简介 链表是非常常用的数据结构之一,它将数据储存在一个个结点中,每个结点存储了它所代表的数据和它下一个结点的指针,通过这些指针链接在一起,形成了一条链。 新建链表 // 定义链表中元素的结构 class ListNode { int val; ListNode next; ListNode(int x) { val = …

    数据结构 2023年5月17日
    00
  • 解析网站处理数据交换时的序列化和反序列化

    当网站处理数据交换时,数据往往要以一定的格式进行序列化和反序列化,以保证数据的传输和存储的正确性。本文将详细讲解如何解析网站处理数据交换时的序列化和反序列化。 什么是序列化和反序列化? 序列化(Serialization),简单来说就是将数据从一种特定的格式转换成字符串的过程。因此经过序列化后的数据可以通过网络传输或者存储到文件中,同时也可以减少数据传输过程…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部