前言
尚硅谷韩顺平老师课堂笔记https://www.bilibili.com/video/BV1E4411H73v?p=194
线性结构:
- 线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系
- 线性结构有两种不同的存储结构,即顺序存储结构(数组)和链式存储结构(链表)。
- 顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的,链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息
- 线性结构常用的有:数组,队列,链表和栈
非线性结构
- 非线性结构包括:二维数组,多维数组,广义表,树结构,图结构
稀疏数组
- 当一个数组中大部分元素为0,或者为同一值时,可以使用稀疏数组保存数组
- 处理方式:
- 记录数组一共有几行几列,有多少个不同的值
- 把不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
二维数组转稀疏数组的思路:
* 1. 遍历原始数组,得到有效数据的个数 sum
* 2. 根据sum就可以创建稀疏数组sparseArr int[sum+1][3]
* 3. 将二维数组的有效数据存入稀疏数组
* 反过来的思路:
* 1.先读取稀疏数组的第一行,根据第一行的数据,创建原始数组
* 2.在读取稀疏数组后几行的数据,并赋值给原来的二维数组
package com.datastructure.sparseArray;
import java.io.*;
import java.util.Arrays;
/**
* @Author DiamondLove
* @Date 2020/11/12 22:50
* @Version 1.0
*/
public class SparseArray {
/**
* 二维数组转稀疏数组的思路:
* 1. 遍历原始数组,得到有效数据的个数 sum
* 2. 根据sum就可以创建稀疏数组sparseArr int[sum+1][3]
* 3. 将二维数组的有效数据存入稀疏数组
* 反过来的思路:
* 1.先读取稀疏数组的第一行,根据第一行的数据,创建原始数组
* 2.在读取稀疏数组后几行的数据,并赋值给原来的二维数组
* @param args
*/
public static void main(String[] args) throws IOException {
//二维数组转稀疏数组
int[][] sparseArr = sparseArr();
//将稀疏数组变为原始数组
originalArr(sparseArr);
//保存稀疏数组
//saveSparseArr(sparseArr);
//读取稀疏数组
//readSparseArr();
}
private static void originalArr(int[][] sparseArr){
//读取稀疏数组的第一行,根据第一行的数据,创建原始数组
int[][] originalArr = new int[sparseArr[0][0]][sparseArr[0][1]];
for (int i = 1; i < sparseArr.length; i++) {
for (int j = 0; j < sparseArr[i].length; j++) {
originalArr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
}
//打印
for (int i = 0; i <originalArr.length; i++) {
for (int j = 0; j < originalArr[i].length; j++) {
System.out.printf("%d\t",originalArr[i][j]);
}
System.out.println();
}
}
//从磁盘读取
private static int[][] readSparseArr() throws IOException {
FileReader reader = new FileReader("./test.txt");
BufferedReader bf = new BufferedReader(reader);
String line = "";
int row= 0;
String res = "";
while ((line =bf.readLine()) != null){
res += line;
row++;
}
int[][] sparseArr = new int[row][3];
String[] split = res.split("\t");
int count = 0;
for (int i = 0; i < sparseArr.length; i++) {
for (int j = 0; j < sparseArr[i].length; j++) {
sparseArr[i][j] = Integer.parseInt(split[count]);
count++;
}
}
//打印稀疏数组
for (int i = 0; i < sparseArr.length; i++) {
System.out.println(Arrays.toString(sparseArr[i]));
}
return sparseArr;
}
//存入磁盘
private static void saveSparseArr(int[][] arr) throws IOException {
File file = new File("./test.txt");
FileWriter writer = new FileWriter(file);
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
writer.write(arr[i][j]+"\t");
}
//'\r' 回车,回到当前行的行首,而不会换到下一行,\n表示回车换行 换到当前位置的下一行,而不会回到行首;
writer.write("\r\n");
}
writer.close();
}
private static int[][] sparseArr(){
int[][] arr = createArr(11,11);
int sum = 0;
//1. 遍历原始数组,得到有效数据的个数 sum
for (int i = 0; i <arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if(arr[i][j] != 0){
sum++;
}
}
}
//2. 根据sum就可以创建稀疏数组sparseArr int[sum+1][3]
int[][] sparseArr = new int[sum+1][3];
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
//将二维数组的有效数据存入稀疏数组
int count = 1;
for (int j = 0; j < arr.length; j++) {
for (int k = 0; k < arr[j].length; k++) {
if(arr[j][k] != 0){
sparseArr[count][0] = j;
sparseArr[count][1] = k;
sparseArr[count][2] = arr[j][k];
count++;
}
}
}
//打印稀疏数组
for (int i = 0; i < sparseArr.length; i++) {
System.out.println(Arrays.toString(sparseArr[i]));
}
return sparseArr;
}
//创建二维数组
private static int[][] createArr(int i, int j){
int[][] arr = new int[i][j];
arr[2][3] = 1;
arr[3][4] = 2;
arr[3][6] = 2;
return arr;
}
}