数据结构与算法笔记一:稀疏数组的应用

稀疏数组

情景:

在这里插入图片描述

也就是说稀疏数组存储的数据都有特殊意义、

情景:

当一个数组中大部分元素为0 的时候,或者为同一个值的数组时,可以使用稀疏数组来保存该数组

处理方法

  1. 记录数组一共几行几列,有多少个不同的值
  2. 把具有不同值的元素的行列以及值记录在一个小规模的数组中,缩小程序的规模
稀疏数组:
rowcolvalue
0原数组总行数原数组总列数有效值个数
1第一个有效值所在行数第一个有效值所在列数有效值是多少
2第二个有效值所在行数第二个有效值所在列数有效值是多少
………………
n第N个有效值所在行数第N个有效值所在列数第N个有效值是多少

特点

列数 = 3列 固定不变

行数 = 有效值的个数+1

在这里插入图片描述

在这里插入图片描述

原来的代码规模是11*11

经过稀疏数组转换后变成了3*3

二维数组转稀疏数组的思路

  • 遍历原始的二维数组,得到有效值的个数sum

  • 根据sum,创建稀疏数组

  • sparseArr int[sum+1][3]
    
  • 将二维数组的有效值数据存入到稀疏数组

稀疏数组转原始的二维数组

先读取我们的稀疏数组第一行,创建原始的二维数组

在读后几行的数据,并赋值给原始的二维数组

代码实现:

public class SparseArray {
    public SparseArray() throws IOException {
    }

    public static void main(String[] args) throws IOException {
        //先创建一个原始的二维数组
        //0表示无用数据(没有棋子) 1表示黑子 2表示蓝子
        //原始的二维数组
        int chessArr1[][] = new int[11][11];
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;
        //输出原数组
//        for (int [] row:chessArr1)
//        {
//            for (int item :row) {
//                System.out.print(item+"\t");
//            }
//            System.out.println();
//        }
        //转换稀疏数组
        //1.先遍历二维数组,得到非零个数
        int sum =0 ;
        for (int i =0;i<chessArr1.length;i++)
        {
            for (int j =0;j<chessArr1.length;j++)
            {
                if (chessArr1[i][j]!=0)
                {
                    sum++;
                }
            }
        }
//        System.out.println(sum);
        //2.创建我们的稀疏数组
        int sparseArray[][] = new int[sum+1][3];
//        //给稀疏数组赋值
        sparseArray[0][0]=chessArr1.length;
        sparseArray[0][1]=chessArr1.length;
        sparseArray[0][2] =sum;
//        //遍历二维数组,将非0值传给稀疏数组
        int count = 0;//count  用于记录是第几个非零数据
        for (int i =0;i<chessArr1.length;i++)
        {
            for (int j =0;j<chessArr1.length;j++)
            {
                if (chessArr1[i][j]!=0)
                {
                    count++;
                   sparseArray[count][0] = i;
                   sparseArray[count][1] = j;
                   sparseArray[count][2] = chessArr1[i][j];
                }
            }
        }
//        //输出稀疏数组
//        System.out.println("-------------");
//        for (int i =0 ;i<sparseArray.length;i++)
//        {
//            System.out.println(sparseArray[i][0]+"\t"+sparseArray[i][1]+"\t"+sparseArray[i][2]+"\t");
//        }
//        //将稀疏数组转换为原始的二维数组
        int chessArr2[][]  = new int [sparseArray[0][0]][sparseArray[0][1]];
        //把有效值赋值到相应的位置上
        for (int i = 1;i<sparseArray.length;i++)
        {
            chessArr2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
        }
        //输出转换回来的二维数组
//        for (int [] row:chessArr2)
//        {
//            for (int item :row) {
//                System.out.print(item+"\t");
//            }
//            System.out.println();
//        }
//        //稀疏数组存盘
        File file = new File("sparesArray.data");
        BufferedWriter bufferedWriter=new BufferedWriter(new FileWriter(file));
        for (int[] row:sparseArray){
            for (int item:row)
            {
                bufferedWriter.write(item+"\t");
            }
            bufferedWriter.write("\n");
            bufferedWriter.flush();
        }
        //从文件读取我们的稀疏数组
        File src = new File("sparesArray.data");
        BufferedReader bufferedReader = null;
        List<Integer> list = new ArrayList<>();
        bufferedReader = new BufferedReader(new FileReader(src));
        String line;//行数
        while ((line = bufferedReader.readLine())!=null)
        {
            String[] str = line.split("\t");
            for (int i=0;i<str.length;i++)
            {
                list.add(Integer.parseInt(str[i]));
            }
        }
        if (bufferedReader!=null){
            bufferedReader.close();
        }
        //打印稀疏数组行数
//        System.out.println("稀疏数组的行数为:  "+Integer.parseInt(list.get(2))+1);   //第三个元素代表不为0的元素有多少个,+1代表稀疏数组的行数
        int sparseArray2[][]=new int[list.get(2)+1][3];
        int j=0;
        for(int i=0;i<list.size();i=i+3) {
            sparseArray2[j][0]=list.get(i);
            sparseArray2[j][1]=list.get(i+1);
            sparseArray2[j][2]=list.get(i+2);
            j++;
        }
        System.out.println("--------从硬盘种读取的稀疏数组------------");
        for(int[] row2:sparseArray2) {
            for(int data:row2) {
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

会写代码的花城

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

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

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

打赏作者

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

抵扣说明:

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

余额充值