尚硅谷Java数据结构和java算法课后作业 ——稀疏数组

目录

稀疏数组的概念 

代码实现(稀疏数组的普通转化)

思路

代码 

难度升级(从文件中读写稀疏数组)

思路

            将稀疏数组输出为txt文件

            将稀疏数组的txt文件读入

代码


稀疏数组的概念 

        所谓稀疏数组,是一种特殊的数据结构,用于有效地表示大部分元素值为默认值(通常为零或空)的二维数组。在稀疏数组中,仅存储非默认值的元素及其对应的行、列和值。

稀疏数组的表示方法通常包括三列:

  1. 原始数组的行数
  2. 原始数组的列数
  3. 非默认值元素的个数

其中,每个非默认值元素都包含三个信息:

  1. 行索引
  2. 列索引
  3. 具体的值

例如下面的11×11的棋盘矩阵

 转换为稀疏数组则为:

        通过使用稀疏数组,可以大大减少对于默认值的存储空间,从而节省内存和存储资源。在处理稀疏数组时,可以根据存储的信息重新构建原始的二维数组。常用于处理稀疏矩阵棋盘游戏等场景,其中大部分元素都具有相同的默认值

代码实现(稀疏数组的普通转化)

思路

        创建一个11×11的chessArray棋盘数组,并自定义进行赋值。而后,根据稀疏数组的特性:第一列为总行数、总列数、非默认数值的总数sum对第一列进行赋值。

        其中,sum主要通过对chessArray数组进行for循环遍历得到。

        第一列赋值完毕,我们通过for循环进行数值的填充:通过两个for循环对chessArray数组中的每个元素进行遍历,当遍历的元素非零时,将其存储到稀疏数组sparseArray中。

        稀疏数组转化为棋盘数组时,主要需要注意两个数组之间的对应关系:稀疏数组sparseArray第一行主要是对棋盘数组进行整体的描述,我们可以通过这一点来创建棋盘数组chessArray1。在进行赋值时,通过稀疏数组sparseArray[0][2]中存储的sum值来确定for循环的次数,而后通过稀疏数组的行索引、列索引、值分别对棋盘数组进行赋值。

        注:sparseArray[0][2]中存储的sum值是棋盘数组的非默认值总数,而不是稀疏数组的总行数。稀疏数组的总行数是sum+1.

代码 

public class sparseArray1 {
    public static void main(String[] args) {
        int[][] chessArray = new int[11][11];
        //定义棋盘,棋盘中设置三个变量
        chessArray[0][2] = 1;
        chessArray[1][1] = 2;
        chessArray[2][3] = 2;
        //输出棋盘
        for (int i = 0; i < chessArray.length; i++) {
            for (int j = 0; j < chessArray[i].length; j++) {
                System.out.print(chessArray[i][j] + "\t");
            }
            System.out.println();
        }

        //定义稀疏数组
        //1.确定稀疏数组的第一行  棋盘数组的行、列、非0值的数量count
        int sum = 0;
        for (int i = 0; i < chessArray.length; i++) {
            for (int j = 0; j < chessArray[i].length; j++) {
                if (chessArray[i][j] != 0) {
                    sum++;
                }
            }
        }

        //定义稀疏数组
        int[][] sparseArray = new int[sum + 1][3];
        sparseArray[0][0] = 11;
        sparseArray[0][1] = 11;
        sparseArray[0][2] = sum;

        int count = 0;
        for (int i = 0; i < chessArray.length; i++) {
            for (int j = 0; j < chessArray[i].length; j++) {
                if (chessArray[i][j] != 0) {
                    count++;
                    sparseArray[count][0] = i;
                    sparseArray[count][1] = j;
                    sparseArray[count][2] = chessArray[i][j];
                }
            }
        }
        System.out.println("稀疏数组的输出:");
        for (int[] data : sparseArray) {
            for (int s : data) {
                System.out.print(s + "\t");
            }
            System.out.println();
        }

        int[][] chessArray1 = new int[sparseArray[0][0]][sparseArray[0][1]];
        for (int i = 0; i < sparseArray[0][2]; i++) {
            chessArray1[sparseArray[i+1][0]][sparseArray[i+1][1]] = sparseArray[i+1][2];
        }
        System.out.println("稀疏数组转化为棋盘数组:");
        for (int[] data : chessArray1) {
            for (int s : data) {
                System.out.print(s + "\t");
            }
            System.out.println();
        }

难度升级(从文件中读写稀疏数组)

思路

将稀疏数组输出为txt文件

        通过FilwWriter和for循环遍历进行写入,每个数值之后加入"\t"即可

将稀疏数组的txt文件读入

        首先通过读取文件的行确定稀疏数组的每一行元素。而后,通过"\t"将每个字符进行分割。需要注意的是,此时的我们读取的还是string类型,需要将其转化为int类型才能存到稀疏数组sparseArray中。

        接下来就是按行按列进行for循环写入了 

代码

        //将稀疏数组输出为txt文件
        try {
            FileWriter fw = new FileWriter("C:\\Users\\SirYu\\Desktop\\后端代码\\Algorithm\\sparse_array");
            for (int i = 0; i < sparseArray.length; i++) {
                for (int j = 0; j < sparseArray[i].length; j++) {
                    fw.write(sparseArray[i][j] + "\t");
                }
                fw.write("\n");

            }
            fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //将稀疏数组的文件进行读取
        try {
            List<String> strs = Files.readAllLines(Paths.get("C:\\Users\\SirYu\\Desktop\\后端代码\\Algorithm\\sparse_array"), StandardCharsets.UTF_8);
            for (int i = 0; i < strs.size(); i++) {
                String[] s = strs.get(i).split("\t");
                for (int j = 0; j < s.length; j++) {
                    sparseArray[i][j] = Integer.parseInt(s[j]);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("输出从文件中读取数据后的稀疏数组:");
        for (int[] data : sparseArray) {
            for (int s : data) {
                System.out.print(s + "\t");
            }
            System.out.println();
        }

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

打野怪的江小河

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值