线性结构与非线性结构
线性结构有两种不同的存储结构,即顺序存储结构(数组)和链式存储结构(链表),顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的,链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息。
线性结构常见的有:数组,队列,链表合栈;
非线性架构包括:二维数组,多维数组,广义表,树结构,图结构。
稀疏数组
定义
当一个数组中大部分元素为0,或者为一同一个值得数组时,可以使用稀疏数组来保存该数组。稀疏数组可以看做是普通数组的压缩,但是这里说的普通数组是值无效数据量远大于有效数据量的数组
稀疏数组的处理方法是:
- 记录数据一共有几行几列,有多少个不同的值;
- 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模;
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 2 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
其稀疏数组形式:
row | col | value |
---|---|---|
11 | 11 | 2 |
1 | 2 | 1 |
2 | 3 | 2 |
第一行用来存储二维数组的行数,列数及非0数量;其余行依次存储非0数字所在行数,列数及值
二维数组转稀疏数组的思路:
- 遍历原始二维数组,得到有效数据的个数
- 根据sum就可以创建稀疏数据 spareArr =int[sum+1] [3]
- 将二维数组的有效数据存入到稀疏数组
稀疏数组转二维数组的思路:
- 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数据,比如chessArr2=int[11][11]
- 在读取稀疏数组后几行的数据,并赋值给原始的二维数组即可
代码实现
package com.example.learn.DataStructures;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* 二维数据及稀疏数组的相互转换及应用
* @author kaikai.zhang
* @date 2021/10/17 16:01
*/
public class SparseArray {
public static void main(String[] args) {
//1.定义一个二维数据并赋值 0 代表无子 1代表黑子 2代表白子
int[][] array=new int[11][11];
//初始化原始数据
array[1][2]=1;
array[2][3]=2;
//打印二维数组
System.out.println("原始的二维数组====");
for (int[] ints : array) {
for (int data : ints) {
System.out.printf("%d\t",data);
}
//换行操作
System.out.println();
}
/**
* 二维数组输出
* 0 0 0 0 0 0 0 0 0 0 0
* 0 0 1 0 0 0 0 0 0 0 0
* 0 0 0 2 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0 0 0 0
*/
//2.遍历原始二维数据,获取sum
int sum=0;
for (int i=0;i<11;i++){
for(int j=0;j<11;j++){
if(array[i][j]!=0){
sum++;
}
}
}
//3.定义稀疏数组
int[][] sparseArray=new int[sum+1][3];
//给稀疏数组首行赋值 行数|列数|非0个数
sparseArray[0][0]=11; //行数
sparseArray[0][1]=11; //列数
sparseArray[0][2]=sum; //非0值的个数
//4.将二维数组的有效数据存入到稀疏数组
//定义计数器标识行数
int count=0;
for (int i=0;i<11;i++){
for(int j=0;j<11;j++){
if(array[i][j]!=0){
count++;
//记录非0值得行数|列数|值
sparseArray[count][0]=i;
sparseArray[count][1]=j;
sparseArray[count][2]=array[i][j];
}
}
}
//输出稀疏数组
System.out.println("稀疏数组开始输出=======");
for (int[] ints : sparseArray) {
for (int data : ints) {
System.out.printf("%d\t",data);
}
//换行操作
System.out.println();
}
try {
sparseArrayToIo(sparseArray);
} catch (IOException e) {
e.printStackTrace();
}
/**
* 稀疏数组输出
* 11 11 2
* 1 2 1
* 2 3 2
*/
try {
int[][] newSpareArray = sparseArrayFromIo(count + 1);
System.out.println("稀疏数组转回二维数组=========");
//1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数据,
int[][] newArray=new int[newSpareArray[0][0]][newSpareArray[0][1]];
//2. 在读取稀疏数组后几行的数据,并赋值给原始的二维数组
//从稀疏数组的第二行开始 小于稀疏数组的length
for(int i=1;i<newSpareArray.length;i++){
//稀疏数组的第一列是新数组的行 稀疏数组的第二列是新数组的列 稀疏数组第三行是新数组的值
newArray[newSpareArray[i][0]][newSpareArray[i][1]]=newSpareArray[i][2];
}
for (int[] ints : newArray) {
for (int data : ints) {
System.out.printf("%d\t",data);
}
//换行操作
System.out.println();
}
} catch (IOException e) {
e.printStackTrace();
}
/**
* 重写后的稀疏数组
* 0 0 0 0 0 0 0 0 0 0 0
* 0 0 1 0 0 0 0 0 0 0 0
* 0 0 0 2 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0 0 0 0
*/
}
/**
* 将稀疏数组写入文件
* @param sparseArrsy
*/
public static void sparseArrayToIo(int[][] sparseArrsy) throws IOException {
File file = new File("C:\\Users\\Administrator\\Desktop\\sparseArrsy.txt");
if(!file.exists()){
file.createNewFile();
}
FileWriter fileWriter = new FileWriter(file);
for(int i=0;i<sparseArrsy.length;i++){
for(int j=0;j<3;j++){
fileWriter.write(sparseArrsy[i][j]);
}
}
fileWriter.close();
}
/**
* 读文件到稀疏数组
* @param lineNum
*/
public static int[][] sparseArrayFromIo(int lineNum) throws IOException {
File file = new File("C:\\Users\\Administrator\\Desktop\\sparseArrsy.txt");
int[][] sparseArray=new int[lineNum][3];
FileReader reader = new FileReader(file);
for(int i=0;i<lineNum;i++){
for(int j=0;j<3;j++){
int num = reader.read();
sparseArray[i][j]=num;
}
}
return sparseArray;
}
}