数据机构笔记
数组
定义:
是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式。这些有序排列的同类数据元素的集合称为数组。
特点
1、里面的所有的数据的类型必须要保持一致性(例如:int[6] 表示该数组里面的数据为整形的)
2、在计算机里面的储存空间也是连续的。数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起。
3、数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。例如,a[0]表示名字为a的数组中的第一个元素,a[1]代表数组a的第二个元素,以此类推。
注意 :
1、在特点里面总结的它在计算机里面的存贮为连续的空间,那么有二维数组和三维数组,它们的空间地址应该怎么算呢?将其进行降维度进行想就好了。
2、在数组的下标都是从0开始取的。
稀疏数组
产生背景:在二维数组学习的时候,大家会发现有时候出现很多毫无意义且冗余的数据,列如:(在五子棋游戏的开发中的时候,我们记录棋盘的数据;在地图坐标中标注地点的时候总有很多没有意义的数据)
实际的例子:用一个二维数组来记录上一局的棋子的位置,肯定是想到用二维数组来记录比较方便,接下来我用一般人的思维来处理看看:(首先我们规定0表示是没有棋子,1表示黑子,2表示黑子,试着来记录一盘15*15规格的棋盘)
棋盘的位置如图。
那么简单粗暴的方式来记录这张表就应该是
0 0 0 0 0 0 0 0 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 1 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 0 1 1 1 2 0 0 0 0 0 0 0
0 0 0 1 2 1 1 1 0 0 0 0 0 0 0
0 0 2 0 2 1 2 0 2 0 0 0 0 0 0
0 0 0 0 0 2 2 0 0 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
发现了什么吗?
首先就是我们的二维数组里面的有效数据就是21个,而无效数据0占据了很多的空间,并且如果存盘,那么当数据量大的时候对IO流的操作是否就降低了性能了。
所以就引入了我们现在的主题了,稀疏数组来处理。
那么接下来看看稀疏数组的处理方式吧。
稀疏数组的处理思路
1、数组的列数总是确定的为三列,分别是对应原数组的行、列、值
2、数组的第一行记录的是原数组的列、行、和有效的值个数
3、从第二行起开始记录所处位置的行和列分别对应什么值
咱们通过稀疏数组来记录上面的数组的长相就是 注意:数组的下标都是从0开始计数的。
row column value
0(第一行) 15 15 21
1(第二行) 1 7 1
2(第三行) 2 5 2
3(第四行) 2 6 1
…(一共二十多个,我就不一 一对应了)
那么想象一下,这样一来我们的数据是不是就进行了压缩了?原来需要15 * 15=175个数据,转化为稀疏数组后只需要21 * 3=36个数据来存储。
说了那么多的,也要上代码来实现一下相对应的转换,这个才是实际的,那么好,接下来我们来进行
Java代码的实现
开始之前还是要讲一讲思路吧,直接上图
具体核心的代码实现:
public static int[][] arrayToSparseArray(int[][] array){//转化为稀疏数组
//统计得到有效数据数据
int sum=0;
for (int [] row:array) {
for (int item : row) {
if (item != 0) {
sum++;
}
}
}
int[][] sparseArray=new int[sum+1][3];//定义好稀疏数组
System.out.println("--------原数组:-----------");
for (int [] row:array) {
for (int item : row) {
System.out.print("\t" + item);
}
System.out.println();
}
/**
* @author TQY 杨显伍
* @date 2022/9/29 15:33
* effect: 初始化第一行
*/
sparseArray[0][0]=array.length;
sparseArray[0][1]=array[0].length;
sparseArray[0][2]=sum;
/**
* @author TQY 杨显伍
* @date 2022/9/29 15:33
* effect: 真正核心的代码
*/
int sRow=1;//插入到稀疏数组时确定行数。
for (int row=0;row< array.length;row++){
for (int coul=0;coul<array[row].length;coul++){
if (array[row][coul]!=0){
sparseArray[sRow][0]=row;
sparseArray[sRow][1]=coul;
sparseArray[sRow][2]=array[row][coul];
sRow++;
}
}
}
return sparseArray;
}
public static int[][] sparseArrayToArray(int[][] sparseArray){//稀疏数组转化为数组
int [][] array=new int[sparseArray[0][1]][sparseArray[0][1]];//初始化数组
/**
* @author TQY 杨显伍
* @date 2022/9/29 15:50
* effect: 核心代码
*/
for (int row=1;row<sparseArray.length;row++){
for (int clou=0;clou<sparseArray[row].length;clou++){
array[sparseArray[row][0]][sparseArray[row][1]]=sparseArray[row][2];
}
}
return array;
}
代码运行结果图