尚硅谷–数据结构笔记
数据结构是什么?
线性结构
1)线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系
2)线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构。顺序存储的,线性表称为顺序表,顺序表中的存储元素是连续的(这里指的是内存地址是连续的)
3)链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存,放数据元素以及相邻元素的地址信息
4)线性结构常见的有:数组、队列、链表和栈
非线性结构
非线性结构包括:二维数组,多维数组,广义表,树结构,图结构(比较常见)
第一章:稀疏数组
基本介绍
1、当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
2、稀疏数组的处理方法是:
1)记录数组一共有几行几列,有多少个不同的值
2)把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
例子:棋盘存储成稀疏数组
问题描述:棋盘上黑棋子对应1,蓝色棋子对应2,没有棋子的为0。
稀疏数组存储方式:
第一行存储的值是原数组的行、列和多少个不为0的值。
稀疏数组代码实现
package datastructures;
public class SparseArry {
public static void main(String[] args) {
//创建一个二维数组
int[][] sparse = new int[10][9];
sparse[1][2] = 1;
sparse[2][3] = 2;
sparse[3][4] = 1;
sparse[1][5] = 1;
int count = 0;//记录不为0个数,用作稀疏数组行数。
//遍历二维数组 找出要存的值(即不为0的值)
for (int i = 0; i < sparse.length; i++) {
for (int j = 0; j < sparse[i].length; j++) {
if(sparse[i][j] != 0) {
count++;
}
}
}
//1、创建一个稀疏数组,2、把二维数组存入稀疏数组
int[][] sparseArry = new int[count+1][3];//count+1:因为稀疏数组第一行用于记录原始二维数组的行数和每行个数以及不为0的个数 row col val
sparseArry[0][0] = sparse.length;//数组行数
sparseArry[0][1] = sparse[0].length;//数组个数
sparseArry[0][2] = count;//要存的个数
//存入稀疏数组
int spIndex = 1;//用来做稀疏数组的下标
for (int i = 0; i < sparse.length; i++) {
for (int j = 0; j < sparse[i].length; j++) {
if(sparse[i][j] != 0) {
sparseArry[spIndex][0] = i;//拿到行号
sparseArry[spIndex][1] = j;//拿到第几个
sparseArry[spIndex][2] = sparse[i][j];//把值存入稀疏数组
spIndex++;
}
}
}
//遍历稀疏数组
System.out.println("遍历稀疏数组开始-----------");
for (int i = 0; i < sparseArry.length; i++) {
System.out.print(sparseArry[i][0]+"\t");
System.out.print(sparseArry[i][1]+"\t");
System.out.print(sparseArry[i][2]+"\t");
System.out.println();
}
System.out.println();
//还原成棋盘(原始二维数组)
int[][] reset = new int[sparseArry[0][0]][sparseArry[0][1]];//用稀疏数组中存的行数和个数还原二维数组
for (int i = 1; i < sparseArry.length; i++) {
reset[sparseArry[i][0]][sparseArry[i][1]] = sparseArry[i][2];
}
System.out.println("还原成原始二维数组-----------");
for (int i = 0; i < reset.length; i++) {
for (int j = 0; j < reset[i].length; j++) {
System.out.print(reset[i][j]+"\t");
}
System.out.println();
}
}
}