基于Java的数据结构&&算法学习(一)——数组

学习起因

不想讲什么大道理,也讲不来。不能只当码农,路还很长,一步步走,提升自我。接近于一篇学习日记&总结,尽量分享经验,共勉。有发现错误或者不足之处可以大胆用力指出,代码的路上谁不是磕磕碰碰。

资料来源

bilibili韩顺平数据结构与算法 ,不愧是央妈钦点的中国最大学习网站,娱乐之余不要忘记学习。

本系列部分图片来自视频截图,如有侵权,请联系作者删除修正。

个人理解

浅谈学习方法:

  1. 从现实案例入手,引出问题。
  2. 介绍对应的数据结构,讲解原理,方法
  3. 应用实例夯实

前置条件:

  1. 至少掌握一门编程语言,我是Java
  2. 有编程环境,本系列使用idea+jdk1.8

话不多说,开始学习之旅

定义

经典算法

在这里插入图片描述

分类

  • 根据元素存储是否连续划分为线性结构和非线性结构
    在这里插入图片描述

数组


稀疏数组sparseAaary

案例背景

简易五子棋游戏的存盘和读盘,直接存便是一个二维数组,在数组中不同数组少的情况下,占用空间大,稀疏数组可以有效的压缩数组大小,节省空间。

介绍

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

int[] sparseArrawy = new int[size][3]
  1. size值为“目标数组中不同值的个数+1”,多出来的一行记录目标数组共有几行几列以及多少个不同的值。
  2. 稀疏数组固定是3列,row——col——value。

格式
第一行固定记录压缩前的数组共有几行几列及多少不同的值
第二行开始,记录不同值的元素所在行row、所在列col、值value
没记录的则是默认值。注意,重复的不同值也算

案例及思路分析

在这里插入图片描述

代码实现

注意:有使用基本的IO流操作。

public class SparseArray {

    /**
     * 思路:
     * 1. 获取数组
     * 2. 遍历目标数组,获得不同的值,并存入稀疏数组中
     * 3. 新建稀疏数组,大小由目标数组决定
     * 4. 将稀疏数组存放到磁盘当中
     * 5. 从磁盘当中读取稀疏数组
     * 6. 根据稀疏数组生成二维数组
     */
    public static void main(String[] args) throws IOException {

        int[][] targetArray = new int[11][10];
        targetArray[1][2] = 1;
        targetArray[2][3] = 2;

        System.out.println("原始二维数组:");
        for (int[] array:targetArray) {
            for (int i : array) {
                System.out.printf("%d\t", i);
            }
            System.out.println();
        }

        //2. 遍历目标数组,获得不同的值的数量\
        int sum = 0;
        for (int i = 0; i < targetArray.length; i++) {
            for (int j = 0; j < targetArray[i].length ; j++) {
                if (targetArray[i][j] != 0){
                    sum++;
                }
            }
        }
        System.out.println("不同值的数量为:" + sum);

        //3. 新建稀疏数组,大小由目标数组决定
        int[][] sparseArray = new int[sum+1][3];
        sparseArray[0][0] = targetArray.length;
        sparseArray[0][1] = targetArray[0].length;
        sparseArray[0][2] = sum;
        int sparseRow = 1;
        for (int i = 0; i < targetArray.length; i++) {
            for (int j = 0; j < targetArray[i].length ; j++) {
                if (targetArray[i][j] != 0 && sparseRow <= sum+1){
                    sparseArray[sparseRow][0] = i;
                    sparseArray[sparseRow][1] = j;
                    sparseArray[sparseRow][2] = targetArray[i][j];
                    sparseRow++;
                }
            }
        }

        System.out.println("————————稀疏数组————————");
        for (int[] sparse: sparseArray) {
            for (int v : sparse) {
                System.out.printf("%d\t", v);
            }
            System.out.println();
        }
        //4. 将稀疏数组存放到磁盘当中
        OutputStreamWriter outputStreamWriter = new FileWriter(new File("E:\\wzwPro\\wzw.txt"));
        String temp = "";
        System.out.println("----稀疏数组存到磁盘开始----");
        for (int[] sparse: sparseArray) {
            for (int v : sparse) {
                temp = temp.concat(String.valueOf(v)).concat("\t");
            }
            System.out.println("temp = " + temp);
            outputStreamWriter.write(temp);
            outputStreamWriter.write("\n");
            //outputStreamWriter.flush();
            temp = "";
        }
        outputStreamWriter.close();
        System.out.println("----稀疏数组存到磁盘结束----");

        //5. 从磁盘当中读取稀疏数组
        //6. 根据稀疏数组生成二维数组
        System.out.println("----从磁盘读取稀疏数组开始----");
        String path = "E:\\wzwPro\\wzw.txt";
        BufferedReader reader = new BufferedReader(new FileReader(path));
        String line;
        int newRow = 0;
        int newCol = 0;
        //根据第一行获取稀疏数组的行列及不同值个数
        if ((line = reader.readLine()) != null) {
            String[] t = line.split("\t");
             newRow = Integer.parseInt(t[0]);
             newCol = Integer.parseInt(t[1]);
        }
        int[][] newArray = new int[newRow][newCol];
        while ((line = reader.readLine()) != null) {
            String[] t = line.split("\t");
            newArray[Integer.parseInt(t[0])][Integer.parseInt(t[1])] = Integer.parseInt(t[2]);
        }
        reader.close();
        System.out.println("----从磁盘读取稀疏数组结束----");

        System.out.println("----根据稀疏数组生成的二维数组----");
        for (int[] array:newArray) {
            for (int i : array) {
                System.out.printf("%d\t", i);
            }
            System.out.println();
        }
    }
}

磁盘地址可以根据自己需要修改。

运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值