算法与数据结构-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 代码实现
Line(封装稀疏数组每一行)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; } }稀疏数组实现存盘及复盘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(); } }