线性结构的特点:
数据元素之间是一对一的线性关系。
存储结构有两种:
顺序存储和链式存储。分别对应顺序表和链式表
顺序表:存储元素是连续的(数组)
链式表:存储元素不一定连续(链表)
线性结构常见的有:数组、队列、链表和栈
连续指的是地址是连续的。
非线性结构:
不是一对一的关系
非线性结构包括:二维数组、多维数组、广义表、树结构、图结构
稀疏数组
当一个数组大部分元素为0,或大部分为重复数值。可以使用稀疏数组来简化二维数组。第一行的值:一共多少行、一共多少列,一共多少数据。第二行的值:行、列。对应的值
第三行到下面都是类似第二行。
稀疏数组的作用:压缩空间,提高性能
二维数组和稀疏数组是如何相互转化的呢?
二维数组转稀疏数组:
1.读取二维数组的有效数据,有效数组为Sum
2.创建一个稀疏数组sparseArr int[sum+1][3]
3.将有效数据写入到稀疏数组中
稀疏数组转成二维数组:
1.读取第一行的数据,确定二维数组的行和列的值
2.从后面的行中读取数据写入到二维数组中
代码中的冒号是重点
一种新的遍历二维数组方式
public class test1 {
public static void main(String[] args) {
// 创建一个二维数组,行和列都是11
//用1表示白子,2表示黑子
int chessArry[][] = new int[11][11];
chessArry[1][2] = 1;
chessArry[2][3] = 2;
//遍历出数组
for(int[] row : chessArry) {//循环遍历每一个数组元素,提取出来的数据是一行一行的数据
for(int data : row) {//将上面一行一行的数据再次遍历出来一个一个的值
System.out.printf("%d\t",data);
}
System.out.printf("\n");
}
}
}
这里没有对其他数组中的元素赋值,输出为0,默认为0,这里是int类型的数组
如果是String类型的数组默认值则为null
package alibab;
import java.io.*;
public class test1 {
public static void main(String[] args) throws IOException {
// 创建一个二维数组,行和列都是11
//用1表示白子,2表示黑子
int chessArry[][] = new int[11][11];
chessArry[1][2] = 1;
chessArry[2][3] = 2;
//遍历出数组
System.out.println("输出二维数组:");
for(int[] row : chessArry) {//循环遍历每一个数组元素,提取出来的数据是一行一行的数据
for(int data : row) {//将上面一行一行的数据再次遍历出来一个一个的值
System.out.printf("%d\t",data);
}
System.out.printf("\n");
}
//获取有效数据sum的值
int sum = 0;
for(int i = 0;i < 11;i ++) {
for(int j = 0;j < 11;j++) {
if (chessArry[i][j] != 0) {
sum ++;
}
}
}
System.out.println("输出sum值:");
System.out.println(sum);
int sparseArr[][] = new int[sum + 1][3];
//先对稀疏数组的第一行赋值
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
int row = 1;//用于记录稀疏举证的有效行数,基础值为1
for(int i = 0;i < 11;i ++) {
for(int j = 0;j < 11;j++) {
if (chessArry[i][j] != 0) {
//只处理有效的数据
int value = chessArry[i][j];
sparseArr[row][0] = i;
sparseArr[row][1] = j;
sparseArr[row][2] = value;
row++;
}
}
}
//
System.out.println("输出稀疏数组:");
for(int[] Srow : sparseArr) {//循环遍历每一个数组元素,提取出来的数据是一行一行的数据
for(int data : Srow) {//将上面一行一行的数据再次遍历出来一个一个的值
System.out.printf("%d\t",data);
}
System.out.printf("\n");
}
//将稀疏数组恢复为原始数组
/**
* 先获取原始数组的大小
*/
int chessArry2[][]= new int[sparseArr[0][0]][sparseArr[0][1]];
for(int i = 1;i < sparseArr.length ;i ++) { // sparseArr.length 指的是二维数组行的数目
/*
* int a = sparseArr[i][0]; int b = sparseArr[i][1]; int c = sparseArr[i][2];
*/
chessArry2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
//输出还原的原始数组
for(int[] row2 : chessArry2) {//循环遍历每一个数组元素,提取出来的数据是一行一行的数据
for(int data : row2) {//将上面一行一行的数据再次遍历出来一个一个的值
System.out.printf("%d\t",data);
}
System.out.printf("\n");
}