线性结构
- 数据元素之间存在一对一的线性关系。
- 存储结构。顺序存储(数组)和链式存储(链表) 。顺序存储的线性表称为顺序表,顺序表中的元素是连续的。
- 链表中的元素不一定是连续的。
- 常见的线性结构:数组,对列,链表和栈。
非线性结构
树,图
一.什么是稀疏数组?
当一个数组中大部分元素为0,或者为同一个值时,可以用稀疏数组来保存该数组。
稀疏数组处理方法:
- 记录数组一共有几列几行,有多少个不同值。
- 把不同值所在行和列及其值记录在一个小规模的数组里。
二.实例及代码实现
二维数组转换为稀疏数组。
稀疏数组转换为二维数组。
/**
* Project Name:leetcode
* File Name:SpareArray.java
* Package Name:SpareArray
* Date:2020年2月1日下午10:34:44
* Copyright (c) 2020, chenzhou1025@126.com All Rights Reserved.
*
*/
package SpareArray;
/**
* ClassName:SpareArray <br/>
* Function: TODO ADD FUNCTION. <br/>
* Reason: TODO ADD REASON. <br/>
* Date: 2020年2月1日 下午10:34:44 <br/>
*
* @author yrz
* @version
* @since JDK 1.6
* @see
*/
public class SpareArray {
public static void main(String[] args) {
// 创建原始二维数组 11*11
// 0:表示没有棋子,1表示 黑子,2表示 蓝子
int chessArr[][] = new int[11][11];
chessArr[1][2] = 1;
chessArr[2][3] = 2;
// 输出二维数组
System.out.println("原始数组-------------");
for (int[] chess : chessArr) {
for (int arr : chess) {
System.out.printf("%d\t", arr);
}
System.out.println();
}
// 将原始数组转换为稀疏数组
// 1. 遍历 原始的二维数组,得到有效数据的个数 sum
int sum = 0;
for (int i = 0; i < chessArr.length; i++) {
for (int j = 0; j < chessArr.length; j++) {
if (chessArr[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;
// 3. 将二维数组的有效数据数据存入到 稀疏数组
int count = 0;
for (int i = 0; i < chessArr.length; i++) {
for (int j = 0; j < chessArr.length; j++) {
if (chessArr[i][j] != 0) {
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArr[i][j];
}
}
}
// 输出稀疏数组
System.out.println();
System.out.println("输出稀疏数组");
for (int[] sparse : sparseArr) {
for (int data : sparse) {
System.out.printf("%d\t", data);
}
System.out.println();
}
// 稀疏数组转原始的二维数组的思路
// 1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的 chessArr2 = int [11][11]
int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
// 2. 在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可.
for (int i = 1; i < sparseArr.length; i++) {
chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
// 输出还原后的原始数组
System.out.println();
System.out.println("还原后的原始数组");
for (int[] chess : chessArr2) {
for (int data : chess) {
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
输出稀疏数组
11 11 2
1 2 1
2 3 2
还原后的原始数组
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
改造代码:
- 保证函数只做一件事
- 命名规范
/**
* Project Name:leetcode
* File Name:SpareArray.java
* Package Name:SpareArray
* Date:2020年2月1日下午10:34:44
* Copyright (c) 2020, chenzhou1025@126.com All Rights Reserved.
*
*/
package SpareArray;
/**
* ClassName:SpareArray <br/>
* Function: TODO ADD FUNCTION. <br/>
* Reason: TODO ADD REASON. <br/>
* Date: 2020年2月1日 下午10:34:44 <br/>
*
* @author yrz
* @version
* @since JDK 1.6
* @see
*/
public class SpareArray2 {
public static void main(String[] args) {
// 创建原始二维数组 11*11
// 0:表示没有棋子,1表示 黑子,2表示 蓝子
int chessArr[][] = new int[11][11];
chessArr[1][2] = 1;
chessArr[2][3] = 2;
// 输出二维数组
System.out.println("原始数组-------------");
for (int[] chess : chessArr) {
for (int arr : chess) {
System.out.printf("%d\t", arr);
}
System.out.println();
}
// 将原始数组转换为稀疏数组
int sparseArr[][] = convertOriginalArrayToSparseArray(chessArr);
// 稀疏数组转原始的二维数组的思路
convertSparseArrayToOriginalArray(sparseArr);
}
// 改造代码
private static int[][] convertOriginalArrayToSparseArray(int chessArr[][]) {
// 1. 遍历 原始的二维数组,得到有效数据的个数 sum
int sum = 0;
for (int i = 0; i < chessArr.length; i++) {
for (int j = 0; j < chessArr.length; j++) {
if (chessArr[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;
// 3. 将二维数组的有效数据数据存入到 稀疏数组
int count = 0;
for (int i = 0; i < chessArr.length; i++) {
for (int j = 0; j < chessArr.length; j++) {
if (chessArr[i][j] != 0) {
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArr[i][j];
}
}
}
// 输出稀疏数组
System.out.println();
System.out.println("输出稀疏数组");
for (int[] sparse : sparseArr) {
for (int data : sparse) {
System.out.printf("%d\t", data);
}
System.out.println();
}
return sparseArr;
}
private static void convertSparseArrayToOriginalArray(int[][] sparseArr) {
// TODO Auto-generated method stub
// 1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的 chessArr2 = int [11][11]
int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
// 2. 在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可.
for (int i = 1; i < sparseArr.length; i++) {
chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
// 输出还原后的原始数组
System.out.println();
System.out.println("还原后的原始数组");
for (int[] chess : chessArr2) {
for (int data : chess) {
System.out.printf("%d\t", data);
}
System.out.println();
}
}
}