数据结构与算法-稀疏数组

数据结构与算法-稀疏数组

稀疏数组(sparsearray)

介绍:当一个数组中大部分元素为0或者为其他同一个值的数组时,我们可以使用稀疏数组来进行保存。

如下图,代码情景所展示:

  • 稀疏数组的第一行内容主要包括,[0][0]记录原始数组共有几行,[0][1]记录原始数组共有几列,[0][2]记录原始数组中有几个不同的值。
  • 稀疏数组的后几行则表示,该值在原始数组中的几行几列。
  • 稀疏数组共有三列,列数是固定的。行数根据原始数组的不同值个数决定。

代码实例

在这里插入图片描述

通过上图中提供的情景,进行代码编写

package com.liulin.sparsearray;

import org.junit.Test;

public class SparseArrayTest {
    /**
     * 提供一个棋盘,用 1表示黑子,2表示蓝子,0表示棋盘空
     * 将棋盘以二进制代码体现出来
     *将原始二维数组转换为稀疏数组
     */
    @Test
    public void getArray(){
        //创建11*11大小的原始数组
        int[][] currentArray = new int[11][11];
        //根据图片内容给原始数组进行赋值操作
        currentArray[1][2] = 1;
        currentArray[2][3] = 2;

        //此时我们需要知道,原始数组中有几个有效元素
        int sum = 0;
        //通过增强for循环进行数组遍历
        for (int[] a : currentArray){
            for (int x : a){
                //判断原始二维数组里面,不为空的有效数值个数
                if (x != 0){
                    sum++;
                }
            }
        }
        System.out.println(sum);
        //拿到原始数组中的有效数值个数
        //可以创建我们稀疏数组的大小,为(sum+1)*3
        int[][] sparseArray = new int[sum+1][3];

        //由稀疏数组包含内容条件,可知
        //稀疏数组[0][0]为原始数据行数
        sparseArray[0][0] = currentArray.length;
        //稀疏数组[0][1]为原始数据列数
        sparseArray[0][1] = currentArray[0].length;
        //稀疏数组[0][2]为原始数组有效值个数
        sparseArray[0][2] = sum;

        /**
         * 向稀疏数组中填入,原始数组中有效值位置,需要通过循环判断每一个数
         * 所以,我们设置一个变量index,表明此时加入的数值为第几个
         * 同时也可以指定此时稀疏数组的行数下标
         */
        int index = 1;
        //for循环遍历原始二维数组
        for (int i = 0; i < currentArray.length; i++){
            for (int j = 0; j < currentArray[i].length; j++){
                if (currentArray[i][j] != 0){
                    //添加原始数组中有效数值的位置
                    //此时index表示稀缺数组的行数下标
                    sparseArray[index][0] = i;
                    sparseArray[index][1] = j;
                    sparseArray[index][2] = currentArray[i][j];
                    //添加完成后,我们需要对稀疏数组下一行进行添加
                    //index++,表示下一次进来,指向的是数组第三行,下标为2
                    index++;
                    //如果稀疏数组已经将所有有效数存入,则没必要继续循环
                    if (index == sum){
                        break;
                    }
                }
            }
        }
        //对稀疏数组进行遍历显示
        System.out.println("row\tcol\tval");
        for (int[] i:sparseArray){
            for (int x: i){
                System.out.print(x+"\t");
            }
            System.out.println();
        }
    }
}


程序运行结果

在这里插入图片描述


IO流操作

将转换出来的稀疏数组保存进硬盘文件下,代码实例如下(接上半代码):

        //对稀疏数组进行遍历显示
        System.out.println("row\tcol\tval");
        for (int[] i:sparseArray){
            for (int x: i){
                System.out.print(x+"\t");
            }
            System.out.println();
        }
        System.out.println("**************");

        //IO字符输出(写入)流
        FileWriter fileWriter = new FileWriter("sparseArrayFile.txt");
        for (int[] i:sparseArray){
            for (int x: i){
                //增强for循环写入每一个int型值
                fileWriter.write(x);
            }
        }
        //流关闭
        fileWriter.close();

        //IO字符输入(读)流
        int read = 0;
        FileReader fileReader = new FileReader("sparseArrayFile.txt");
        for (;;){
            if ((read = fileReader.read()) != -1){
                System.out.print(read+"\t");
            }else{
                break;
            }
        }
        fileReader.close();

运行效果截图:

在这里插入图片描述


在这里插入图片描述


总结

将稀疏数组从文件中输出到程序,并转换成对应的原始数组操作与上部分类似,就不在重复编写了。

代码编写可能比较简陋,主要是新手刚开始进入学习,希望喜欢的观众老爷可以多多点赞支持加关注,谢谢!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值