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


1、线性与非线性结构

数据结构包括线性结构与非线性结构。

1.1 线性结构

1、线性结构作为最常用的数据结构,其特点是数据元素之间是一对一的线性关系。

2、线性结构有两种不同的存储结构,即顺序存储结构(数组)和链式存储结构(链表),顺序存储的线性表成为顺序表,顺序表存储元素是连续的。

3、链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放的是相邻元素的地址。

4、线性结构常见有:数组、链表、栈、队列。

1.2 非线性结构

非线性结构包括:二维数组、多维数组、广义表、树结构、图结构。

2、稀疏数组

2.1 需求引入

编写五子棋程序中的存盘退出和续上盘的功能

 因为二维数组中很多数据为默认值0,记录了很多无效数据,因此可以使用稀疏数组。

2.2 基本介绍

当一个数组大多数值为0或者其他默认值时,可以使用稀疏数组保存该数组。

稀疏数组的处理方法是:

1、记录数组有多少行,多少列,多少个有效值。

2、把有效值的行列和数值存放在小数组中。

 2.3 应用实例

1、用稀疏数组保存前面的二维数组

2、把稀疏数组存盘,并且可以恢复为新的二维数据

3、整体思路分析

 2.4 代码实现

package day01;

import java.io.Serializable;

public class Line implements Serializable {
    private int row;
    private int col;
    private int val;

    public int getRow() {
        return row;
    }

    public int getCol() {
        return col;
    }

    public int getVal() {
        return val;
    }

    public Line() {
    }

    public Line(int row, int col, int val) {
        this.row = row;
        this.col = col;
        this.val = val;
    }

    public void setRow(int row) {
        this.row = row;
    }

    public void setCol(int col) {
        this.col = col;
    }

    public void setVal(int val) {
        this.val = val;
    }
}
Line(封装稀疏数组每一行)
package day01;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 稀疏数组完成棋盘及棋子的保存
 */
public class sparsearray {

    public static void run() {
        // 原始棋盘
        int[][] arr = new int[11][11];
        arr[1][2] = 1;
        arr[2][3] = 2;
        // 打印原始棋盘
        System.out.println("打印原始数组:");
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j] + "  ");
            }
            System.out.println();
        }

        // 转换成稀疏数组
        int num = 0;
        // 获取原二维数组有效棋子个数
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j] != 0) {
                    num++;
                }
            }
        }
        int[][] sparseArr = new int[num + 1][3];
        sparseArr[0][0] = arr.length;
        sparseArr[0][1] = arr[0].length;
        sparseArr[0][2] = num;
        //装配棋子位置
        int counter = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j] != 0) {
                    counter++;
                    sparseArr[counter][0] = i;
                    sparseArr[counter][1] = j;
                    sparseArr[counter][2] = arr[i][j];
                }
            }
        }

        // 打印稀疏数组
        System.out.println("打印稀疏数组:");
        // 持久化稀疏数组到本地
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(new FileOutputStream("D:\\store\\IDEA\\designMode\\src\\day01\\map.data"));
            List list = new ArrayList();
            for (int i = 0; i < sparseArr.length; i++) {
                System.out.println(sparseArr[i][0] + " " + sparseArr[i][1] + " " + sparseArr[i][2]);
                list.add(new Line(sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]));
            }
            oos.writeObject(list);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                oos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


        // 读取map.data恢复为稀疏数组
        int[][] fileSparseArr = null;
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new FileInputStream("D:\\store\\IDEA\\designMode\\src\\day01\\map.data"));
            try {
                List list = (List) ois.readObject();
                fileSparseArr = new int[list.size()][3];
                for (int i = 0; i < list.size(); i++) {
                    Line line = (Line) list.get(i);
                    fileSparseArr[i][0] = line.getRow();
                    fileSparseArr[i][1] = line.getCol();
                    fileSparseArr[i][2] = line.getVal();
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 打印读取的map.data转换的稀疏数组
        System.out.println("打印读取的稀疏数组:");
        for (int i = 0; i < fileSparseArr.length; i++) {
            System.out.println(fileSparseArr[i][0] + " " + fileSparseArr[i][1] + " " + fileSparseArr[i][2]);
        }


    }


    public static void main(String[] args) {
        run();
    }
}
稀疏数组实现存盘及复盘