Java稀疏数组的应用实践

Java稀疏数组的应用实践

什么是稀疏数组

在Java的数组中,大部分的数组元素都是非零元素。如果一个二维数组中非零元素的个数远远小于数组元素总数时,我们通常称这个二维数组为稀疏数组。

稀疏数组可以通过压缩算法来减少存储空间,常见的稀疏数组压缩方式是压缩成一个一维数组,其中每个元素保存非零元素的值及其所在的索引位置,从而达到节省空间的目的。

稀疏数组的应用场景

当我们需要处理大量稀疏数据时,稀疏数组就可以发挥其作用。例如,我们家里的书店,我们需要跟踪库存并记录每本书的销售记录,但是我们卖的书很多,我们总不能把每本书都存储在一个数组中吧?这时候,我们就可以使用稀疏数组来记录每本书的销售记录,使用稀疏数组的话,我们就只需要记录非零元素的值及其所在位置,从而节省了很多的空间。

稀疏数组的实现方法

稀疏数组可以通过压缩算法来实现,使用一个二维数组来保存稀疏数组的值及其所在的索引位置,然后再将这个二维数组压缩成一个一维数组即可。

以下是一个实现稀疏数组的示例:

public class SparseArray {
    public static void main(String[] args) {
        // 创建一个二维数组
        int[][] arr = new int[4][5];
        arr[0][1] = 1;
        arr[1][2] = 2;
        arr[2][3] = 3;

        // 输出原始数组
        System.out.println("原始数组:");
        for (int[] row : arr) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }

        // 将稀疏数组压缩为一维数组
        int[][] sparseArray = compressSparseArray(arr);
        System.out.println("压缩后的稀疏数组:");
        for (int[] row : sparseArray) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }

        // 将压缩后的稀疏数组恢复为原始数组
        int[][] newArr = restoreSparseArray(sparseArray);
        System.out.println("恢复后的数组:");
        for (int[] row : newArr) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }
    }

    /**
     * 将稀疏数组压缩为一维数组
     *
     * @param arr 稀疏数组
     * @return 一维数组
     */
    public static int[][] compressSparseArray(int[][] arr) {
        // 统计稀疏数组中非零元素的个数
        int sum = 0;
        for (int[] row : arr) {
            for (int data : row) {
                if (data != 0) {
                    sum++;
                }
            }
        }

        // 创建一个一维数组
        int[][] sparseArr = new int[sum + 1][3];

        // 设置稀疏数组的第一行
        sparseArr[0][0] = arr.length;
        sparseArr[0][1] = arr[0].length;
        sparseArr[0][2] = sum;

        // 遍历原始数组,将非零元素保存在稀疏数组中
        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[0].length; j++) {
                if (arr[i][j] != 0) {
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = arr[i][j];
                }
            }
        }

        return sparseArr;
    }

    /**
     * 将一维数组恢复为稀疏数组
     *
     * @param sparseArray 一维数组
     * @return 稀疏数组
     */
    public static int[][] restoreSparseArray(int[][] sparseArray) {
        int row = sparseArray[0][0];
        int col = sparseArray[0][1];
        int[][] newArr = new int[row][col];

        for (int i = 1; i < sparseArray.length; i++) {
            int r = sparseArray[i][0];
            int c = sparseArray[i][1];
            int value = sparseArray[i][2];
            newArr[r][c] = value;
        }

        return newArr;
    }
}

实例介绍

下面我们用两个实例来介绍稀疏数组的应用。

实例一:五子棋游戏

五子棋游戏是一种非常受欢迎的棋类游戏,我们可以使用稀疏数组来存储棋盘,从而达到减少存储空间的目的。以下是一个使用稀疏数组实现五子棋游戏的示例:

public class Gobang {
    private static final int ROW = 15;
    private static final int COL = 15;

    public static void main(String[] args) {
        int[][] chessBoard = new int[ROW][COL];
        // 初始化棋盘
        initChessBoard(chessBoard);

        // 输出棋盘
        System.out.println("当前棋盘:");
        printChessBoard(chessBoard);

        // 下棋
        int x = 7;
        int y = 7;
        int chess = 1;
        putChess(chessBoard, x, y, chess);

        // 输出棋盘
        System.out.println("当前棋盘:");
        printChessBoard(chessBoard);

        // 将棋盘压缩为稀疏数组
        int[][] sparseArr = compressSparseArray(chessBoard);
        System.out.println("压缩后的稀疏数组:");
        printSparseArray(sparseArr);

        // 将稀疏数组恢复为棋盘
        int[][] newArr = restoreSparseArray(sparseArr);
        System.out.println("恢复后的棋盘:");
        printChessBoard(newArr);
    }

    /**
     * 初始化棋盘
     *
     * @param chessBoard 棋盘
     */
    private static void initChessBoard(int[][] chessBoard) {
        for (int i = 0; i < ROW; i++) {
            for (int j = 0; j < COL; j++) {
                chessBoard[i][j] = 0;
            }
        }
    }

    /**
     * 输出棋盘
     *
     * @param chessBoard 棋盘
     */
    private static void printChessBoard(int[][] chessBoard){
        for (int[] row : chessBoard) {
            for (int value : row) {
                System.out.print(value + " ");
            }
            System.out.println();
        }
    }

    /**
     * 下棋
     *
     * @param chessBoard 棋盘
     * @param x x坐标
     * @param y y坐标
     * @param chess 棋子的值
     */
    private static void putChess(int[][] chessBoard, int x, int y, int chess) {
        if (chessBoard[x][y] == 0) {
            chessBoard[x][y] = chess;
        }
    }
}

实例二:地图矩阵

地图矩阵是一个非常常见的应用场景,我们可以将一个非常大的地图压缩成稀疏数组,从而减少存储空间。以下是一个使用稀疏数组实现地图矩阵的示例:

public class MapMatrix {
    public static void main(String[] args) {
        // 创建一个地图矩阵
        int[][] map = new int[1000][1000];
        for (int i = 0; i < 1000; i++) {
            for (int j = 0; j < 1000; j++) {
                map[i][j] = (int) (Math.random() * 10);
            }
        }

        // 输出地图矩阵
        System.out.println("原始地图矩阵:");
        for (int[] row : map) {
            for (int data : row) {
                System.out.printf("%d ", data);
            }
            System.out.println();
        }

        // 将地图矩阵压缩为稀疏数组
        int[][] sparseArr = compressSparseArray(map);
        System.out.println("压缩后的稀疏数组:");
        printSparseArray(sparseArr);

        // 将稀疏数组恢复为地图矩阵
        int[][] newArr = restoreSparseArray(sparseArr);
        System.out.println("恢复后的地图矩阵:");
        for (int[] row : newArr) {
            for (int data : row) {
                System.out.printf("%d ", data);
            }
            System.out.println();
        }
    }
}

上述示例中,我们首先创建了一个随机的地图矩阵,然后将其压缩为稀疏数组,并将稀疏数组恢复为原始地图矩阵。通过这个示例,我们可以了解到稀疏数组的另一个非常实用的应用场景。

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

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • MySQL学习之基础操作总结

    MySQL学习之基础操作总结 MySQL是一种开源的关系型数据库管理系统,它广泛应用于网站开发、数据挖掘和数据分析等领域。本文将介绍MySQL的基础操作,包括创建和删除数据库、创建和删除数据表、查询和修改数据等。 创建和删除数据库 创建数据库 在MySQL中,可以使用CREATE DATABASE语句创建数据库。 CREATE DATABASE mydata…

    other 2023年6月25日
    00
  • 专业级的MySQL开发设计规范及SQL编写规范

    MySQL是目前最流行的关系型数据库之一,适用于各种复杂应用程序的构建,但是在实际使用中如何规范MySQL的开发设计和SQL编写就成为了非常重要的问题。以下是针对这一问题的专业级攻略: 1. 数据库设计规范 在进行数据模型设计时,应当符合下列最佳实践: 1.1 概念模型转化为物理模型的顺序 通常应该首先设计概念模型,并对其进行修正和扩展,之后再转化为物理模型…

    other 2023年6月25日
    00
  • ios网络请求知识一二点

    以下是关于“iOS网络请求知识一二点”的完整攻略,包含两个示例。 iOS网络请求知识一二点 1. NSURLSession NSURLSession是iOS用于进行网络请求的API。它提供了多种网络请求方式,如GET、POST、PUT、DELETE等。NSURLSession可以在后台执行网络请求,支持断点续传、SSL Pinning等功能,是iOS中最常用…

    other 2023年5月9日
    00
  • php的socket编程详解

    PHP的Socket编程详解 简介 Socket编程是一种基于网络编程的方式,可以在网络上不同主机之间进行数据传输。在PHP中,可以利用socket技术进行网络编程,实现网络协议通信、远程调用、实时传输等功能。 原理 Socket是一种相对底层的网络通信模式。Socket通信过程中,需要一个主机作为服务器,另一个主机作为客户端,客户端通过连接服务器来完成数据…

    other 2023年6月27日
    00
  • 电脑总重启 到WINDOWS界面读完滚动条就自动重启怎么办?

    处理电脑突然重启的问题是一个相对复杂的任务,因为它有可能是由多种不同的原因造成的,下面我将提供一个完整攻略,帮助你解决电脑总重启到WINDOWS界面读完滚动条就自动重启的问题。具体步骤如下: 1.进入安全模式: 首先,我们需要尝试进入电脑的安全模式。启动电脑之后,在开机画面中按住F8键不放,等待出现“高级启动选项”的界面,然后选择“安全模式”选项并按Ente…

    other 2023年6月27日
    00
  • android开发中的单例模式应用详解

    以下是关于“Android开发中的单例模式应用详解”的完整攻略,包括基本概念、步骤和两个示例。 基本概念 在Android开发中,单例模式是一种常用的设计模式,它可以确保一个类只有一个实例,并提供全局访问点。单例模式可以避免重复创建对象,节省内存空间,提高程序性能。 步骤 以下是在Android开发中使用单例模式的步骤: 创建一个类:首先,需要创建一个类,这…

    other 2023年5月7日
    00
  • Win10快速预览版19624怎么手动下载更新升级?

    如果您想手动下载并安装Windows10快速预览版19624更新,则可以按照以下步骤: 步骤一:获取更新包下载链接 在Microsoft官方网站上,有可用的Windows10最新的insider预览版更新包下载链接。您可以使用这个链接下载更新包。 示例1:如果您要获取与“Win10快速预览版19624”对应的更新包下载链接,可以按照以下步骤操作: 1.1. …

    other 2023年6月27日
    00
  • hdp企业级大数据平台

    HDP 企业级大数据平台攻略 HDP(Hortonworks Data Platform)是一款企业级大数据平台,它基于 Apache Hadoop 和相关技术构建,提供了一系列工具和服务,用于存储、处理和分析大数据。在本攻略中,我们将介绍如何安装和配置 HDP,并提供两个示例说明。 环境要求 在安装 HDP 之前,您需要确保满足以下要求: 一台运行 Lin…

    other 2023年5月6日
    00
合作推广
合作推广
分享本页
返回顶部