一.线性结构
特点 :数据元素存在一对一线性关系
存储结构:顺序存储结构(地址连续),链式存储结构
链式存储结构:称为链表,可能连续也可能不连续,元素节点中存放数据元素以及相邻元素地址信息
线性结构有:数组,队列,链表,栈
二.非线性结构
包括:二维数组,多维数组,广义表,树结构,图结构
稀疏sparesearray数组
基本介绍
当一个数组中大部分元素为零时,或者同一个值时,可以用稀疏数组进行压缩保存该数组。
处理方法
1.记录一个数组几行几列,多少不同的值
2.把具有不同的值的元素的行列及值记录在一个小规模数组中。(如下图所示)
行(row) | 列(col) | 值(vaul) | |
---|---|---|---|
[0] | 6(总行数) | 7(总列数) | 4(不为零的数字数) |
[1] | 0(数字不为零的所在行) | 3(数字不为零的所在列) | 32 |
[2] | 0 | 6 | 23 |
[3] | 1 | 1 | 1 |
[4] | 1 | 5 | 21 |
应用实例
1.使用稀疏数组,保留二维数组(棋盘,地图等)
2.把稀疏数组存盘,并且可以从新恢复原来的二维数组
3.整体思路分析
4.代码实现
二维数组转稀疏数组的思路:
-
遍历原始的二维数组,得到有效数据的个数
-
根据数据个数就可以创建稀疏数组 a int[个数+1][3】
-
将二维数组的有效数据存储到稀疏数组就可以
稀疏数组转原始数组的思路:
-
先读取稀疏数组第一行,根据行列数创建数组
-
读取稀疏数组的后几行数据并赋给原始二维数组
如下:(基于五子棋数据保存)
public class dataStructures { public static void main(String[] args){ //首先创建一个原始的二维数组,1表示黑子,2表示白子 int[][] chessArr1=new int[11][11]; chessArr1[1][2]=1; chessArr1[2][4]=2; //原始的二维数组 for (int[] row:chessArr1){ for (int data:row) { System.out.printf("%d\t",+); } System.out.println(); } //转稀疏数组 //先遍历二维数组 int sum=0; for(int i=0;i<11;i++){ for(int j=0;j<11;j++){ if (chessArr1[i][j]!=0){ sum++; } } } int[][] sarry=new int[sum+1][3]; sarry[0][0]=11; sarry[0][1]=11; sarry[0][2]=sum; int temp=0; for(int i=0;i<11;i++){ for(int j=0;j<11;j++){ if (chessArr1[i][j]!=0){ sarry[temp][0]=i; sarry[temp][1]=j; sarry[temp][2]=chessArr1[i][j]; } } temp++; } for (int[] row:sarry) { for (int data:row) { System.out.printf("%d\t",data); } System.out.println(); } //将稀疏数组转换为二维数组 int r=sarry[0][0]; int c=sarry[0][1]; int tempx=0; int tempy=0; int[][] chessarry2=new int[r][c]; for (int i=1;i<sarry.length;i++){ tempx=sarry[i][0]; tempy=sarry[i][1]; chessarry2[tempx][tempy]=sarry[i][2]; } for (int[] row:chessarry2){ for (int data:row) { System.out.printf("%d\t",data); } System.out.println(); } } } 输出结果: