Java数据结构之稀疏数组的实现与应用

Java数据结构之稀疏数组的实现与应用

什么是稀疏数组

稀疏数组是一种刻画二维数组中许多元素值都为0的特殊数据结构。它可以提高存储空间的利用率,实现对数据的压缩和优化,减少不必要的处理,提升程序的运行效率。

在稀疏数组中,只有非零元素被存储,而这些元素的索引信息和具体数值的信息都会被记录下来。

稀疏数组的实现与应用

实现步骤

  1. 创建原始的二维数组,存入多个元素;
  2. 统计原始数组中非零元素的个数sum;
  3. 创建大小为(sum+1)*3的稀疏数组,并在第一行记录原始数组的行数、列数和非零元素的个数;
  4. 遍历原始数组,将非零元素的行列信息和具体数值存入稀疏数组;
  5. 将稀疏数组存入文件中。

代码实现如下:

//创建原始数组
int[][] originalArray = new int[5][5];
originalArray[1][2] = 2;
originalArray[2][3] = 3;
originalArray[4][4] = 4;

//统计非零元素的个数
int sum = 0;
for (int i = 0; i < originalArray.length; i++) {
    for (int j = 0; j < originalArray[i].length; j++) {
        if (originalArray[i][j] != 0) {
            sum++;
        }
    }
}

//创建稀疏数组
int[][] sparseArray = new int[sum + 1][3];
sparseArray[0][0] = originalArray.length;
sparseArray[0][1] = originalArray[0].length;
sparseArray[0][2] = sum;

int count = 0;
for (int i = 0; i < originalArray.length; i++) {
    for (int j = 0; j < originalArray[i].length; j++) {
        if (originalArray[i][j] != 0) {
            count++;
            sparseArray[count][0] = i;
            sparseArray[count][1] = j;
            sparseArray[count][2] = originalArray[i][j];
        }
    }
}

//将稀疏数组存入文件中
try {
    FileWriter fw = new FileWriter("sparseArray.txt");
    for (int i = 0; i < sparseArray.length; i++) {
        for (int j = 0; j < 3; j++) {
            fw.write(sparseArray[i][j] + "\t");
        }
        fw.write("\n");
    }
    fw.close();
} catch (IOException e) {
    e.printStackTrace();
}

应用场景

在棋类游戏中,对于棋盘上空白位置较多的情况,采用稀疏数组可以有效地压缩存储空间、简化程序实现。

示例一:五子棋

在五子棋游戏中,棋盘上空白的交叉点较多,采用二维数组存储所有交叉点信息会造成大量浪费,不够实用。通过使用稀疏数组存储五子棋中的棋盘信息,则可以达到压缩存储空间、提高程序响应速度,减少不必要的运算等效果。

代码示例如下:

//创建原始的棋盘数组
int[][] originalArray = new int[15][15];

//在3,3位置下黑子
originalArray[3][3] = 1;
//在4,4位置下白子
originalArray[4][4] = 2;
//在5,5位置下黑子
originalArray[5][5] = 1;

//将原始数组转换为稀疏数组
int sum = 0;
for (int i = 0; i < originalArray.length; i++) {
    for (int j = 0; j < originalArray[i].length; j++) {
        if (originalArray[i][j] != 0) {
            sum++;
        }
    }
}

int[][] sparseArray = new int[sum + 1][3];
sparseArray[0][0] = originalArray.length;
sparseArray[0][1] = originalArray[0].length;
sparseArray[0][2] = sum;

int count = 0;
for (int i = 0; i < originalArray.length; i++) {
    for (int j = 0; j < originalArray[i].length; j++) {
        if (originalArray[i][j] != 0) {
            count++;
            sparseArray[count][0] = i;
            sparseArray[count][1] = j;
            sparseArray[count][2] = originalArray[i][j];
        }
    }
}

//将稀疏数组存入文件中
try {
    FileWriter fw = new FileWriter("chessSparseArray.txt");
    for (int i = 0; i < sparseArray.length; i++) {
        for (int j = 0; j < 3; j++) {
            fw.write(sparseArray[i][j] + "\t");
        }
        fw.write("\n");
    }
    fw.close();
} catch (IOException e) {
    e.printStackTrace();
}

示例二:地图数据

在类似地图信息存储的场合中,采用稀疏数组能够有效地优化存储空间。如果使用一个二维数组存储每个格子的信息,那么在空白格子数量占比较高的情况下,存储空间的浪费比较严重。而使用稀疏数组存储地图信息,则可以达到压缩存储空间、提高程序可读性和目录性的优点。

代码示例如下:

//创建原始的地图数组
int[][] originalArray = {
    {0,0,0,0,0},
    {0,1,0,0,0},
    {0,0,1,0,0},
    {0,0,0,1,0},
    {0,0,0,0,0}
};

//将原始数组转换为稀疏数组
int sum = 0;
for (int i = 0; i < originalArray.length; i++) {
    for (int j = 0; j < originalArray[i].length; j++) {
        if (originalArray[i][j] != 0) {
            sum++;
        }
    }
}

int[][] sparseArray = new int[sum + 1][3];
sparseArray[0][0] = originalArray.length;
sparseArray[0][1] = originalArray[0].length;
sparseArray[0][2] = sum;

int count = 0;
for (int i = 0; i < originalArray.length; i++) {
    for (int j = 0; j < originalArray[i].length; j++) {
        if (originalArray[i][j] != 0) {
            count++;
            sparseArray[count][0] = i;
            sparseArray[count][1] = j;
            sparseArray[count][2] = originalArray[i][j];
        }
    }
}

//将稀疏数组存入文件中
try {
    FileWriter fw = new FileWriter("mapSparseArray.txt");
    for (int i = 0; i < sparseArray.length; i++) {
        for (int j = 0; j < 3; j++) {
            fw.write(sparseArray[i][j] + "\t");
        }
        fw.write("\n");
    }
    fw.close();
} catch (IOException e) {
    e.printStackTrace();
}

总结

通过本文的介绍,我们可以了解到稀疏数组的实现方法和应用场景。在编写程序时,可以结合实际情况,采用恰当的数据结构和算法,提高程序的运行效率和稳定性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据结构之稀疏数组的实现与应用 - Python技术站

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

相关文章

  • JavaScript数据结构yocto queue队列链表代码分析

    JavaScript数据结构yocto queue队列链表代码分析 什么是队列? 队列(Queue)是一种基础的数据结构,属于线性结构,它的特点是在队列尾插入元素,同时在队列头删除元素,遵循先进先出(FIFO)的原则。队列可以简单的理解为排队,先到达的先被服务,而后到达的则等在队列尾排队等待。队列的应用非常广泛,例如排队系统、消息队列等。 队列的实现方式 队…

    数据结构 2023年5月17日
    00
  • C++线性表深度解析之动态数组与单链表和栈及队列的实现

    C++线性表深度解析之动态数组与单链表和栈及队列的实现 动态数组的实现 动态数组是一种可以动态扩展的数组结构,它的容量可以随着需要而动态增加。在C++中,使用vector类可以实现动态数组的功能。vector类相当于动态分配了一块内存空间,在使用时可以根据需要进行动态扩展。下面是一个示例代码: #include <vector> #include…

    数据结构 2023年5月17日
    00
  • C语言进阶数据的存储机制完整版

    C语言进阶数据的存储机制完整版攻略 1. 前言 C语言是一门高度可控的语言,其中其数据的存储机制是必须掌握的基础知识点。本文介绍了C语言数据存储的机制,包括变量在内存中的分配、指针的应用及结构体的组织等内容,旨在帮助读者掌握C语言中的数据存储机制。 2. 变量在内存中的分配 变量在内存中的分配既涉及到内存的分配可操作性,也涉及到相应的存储结构。 2.1. 变…

    数据结构 2023年5月17日
    00
  • Go 语言数据结构之双链表学习教程

    Go 语言数据结构之双链表学习教程 一、前言 双链表是常见的数据结构,Go语言作为一种静态类型的语言,自带指针类型支持,因此在实现双链表时相对比较容易。本文中,我们将介绍双链表的基础理论和实践应用,并结合代码实现来详细讲解。 二、实现双链表的基本操作 1. 创建双链表 创建双链表需要定义链表中存储的元素类型,以及定义一个结构体来表示双链表中的一个节点。 ty…

    数据结构 2023年5月17日
    00
  • Python 实现数据结构-堆栈和队列的操作方法

    Python 实现数据结构-堆栈和队列的操作方法 在Python中,我们可以使用列表(List)数据类型来实现堆栈和队列的操作。 堆栈(Stack)的操作方法 堆栈数据结构可以理解为一种后进先出的数据存储方式,也就是说最后放入堆栈的元素最先被取出。下面介绍一下堆栈的操作方法。 创建一个堆栈 我们可以通过创建一个空的列表来实现一个堆栈。代码如下: stack …

    数据结构 2023年5月17日
    00
  • 解析Facebook的数据库查询引擎Presto在美团的应用

    解析Facebook的数据库查询引擎Presto在美团的应用 什么是Presto? Presto是一个面向分布式查询的数据引擎,由Facebook开发并开源。它支持SQL查询,可以在不同类型的数据源中查询数据(如Hadoop HDFS、Hive等),具有快速、可扩展、灵活等特点。 Presto在美团的应用 美团使用Presto来进行大数据分析,帮助其优化运营…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构与算法之二叉树遍历算法详解【先序、中序、后序】

    JavaScript数据结构与算法之二叉树遍历算法详解 什么是二叉树 二叉树是一种每个节点最多只有两个子节点的树结构,可以用来组织数据、搜索、排序等。 二叉树的遍历 遍历是指按照一定次序访问二叉树中的所有节点。常见的二叉树遍历有三种方式:先序遍历、中序遍历、后序遍历。以下分别对它们进行详细讲解。 前序遍历 前序遍历是指先访问节点本身,然后再遍历其左子树和右子…

    数据结构 2023年5月17日
    00
  • Java链表数据结构及其简单使用方法解析

    Java链表数据结构及其简单使用方法解析 概述 链表是一种非线性结构,由一系列节点按照顺序连接而成。每个节点由数据域和指针域组成,数据域用于存储数据,指针域用于指向下一个节点或者上一个节点。在Java中,链表有多种实现方式,常见的有单向链表、双向链表等。 单向链表的实现 以下是一个单向链表的实现代码示例: public class Node { privat…

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