一,二, 数据结构框架, Java实现稀疏数组
一, 数据结构
二, 稀疏数组
2.1 定义和栗子
- 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
- 稀疏数组的表示方法
- 记录数组一共有几行几列,有多少个不同的值
- 把二维数组的值,以及所处的行索引,列索引记录下来存储到一张规模较小的表中.(注意: 索引都是从0开始,对应的行,列数要+1哦)
-
举个栗子:
2.2 编程实现
2.2.1 思想
Ⅰ, 二维数组转换为稀疏数组的思路
- 遍历原始的二维数组, 得到有效数据的数量 count;
- 根据 count 就可以创建稀疏数组 sparseArr int[sum+1][3]
- 将二维数组的有效数据存入到稀疏数组中.
Q:为什么 count+1 ?
因为稀疏数组的第一行存储总行数,总列数,以及总共的有效值数.从第二行开始才存储有效值;
Ⅱ, 稀疏数组转原始二维数组的思路
- 直接访问稀疏数组第一行的数据,以此创建原始的二维数组;
- 再遍历读取稀疏数组后几行的数组,并赋给原始的二维数组即可.
2.2.2 具体实现
稀疏数组的转换
// 稀疏数组的转换
package ArrayDemo;
public class SparseArray_copy{
public static void main(String[] args) {
Ⅰ, 原始二维数组转换为稀疏数组
//1.定义二维数组
int[][] array = new int[11][11];
/*
2,6列有个值 1 11 11 1
3,5列有个值2 ===> 2 6 2
7,2列有个值9 3 5 2
7 2 9
*/
array[1][5] = 1;
array[2][4] = 2;
array[6][1] = 9;
//遍历数组并打印
///顺便!
// 遍历得出二维数组的有效值个数,从而可以初始化稀疏数组
System.out.println("二维数组如下:");
int count=0;
for(int [] arr : array){
for (int x : arr){
System.out.printf("\t"+x);
if (x != 0)
count++;
}
System.out.println();
}
//2.初始化稀疏数组
///列数是确定的,三元组嘛,当然三列了
行数取决于count;
///直接赋值三元组的第一行(三列分别记录原始二维组的总行数,总列数,以及总的有效值数)
int[][] sparseArray = new int[count+1][3];
sparseArray[0][0] = 11;
sparseArray[0][1] = 11;
sparseArray[0][2] = count;
///取出稀疏数组行数,列数, 和有效值,初始化三元组剩余行
int tmp=1;//标记三元组的行数,注意从第二行开始
for(int i=0; i<array.length; i++){
for (int j=0; j<array[i].length; j++){
if(array[i][j] != 0 ){
sparseArray[tmp][0]=i;
sparseArray[tmp][1]=j;
sparseArray[tmp][2]=array[i][j];
tmp++;
break;
}
}
}
/遍历输出稀疏数组
System.out.println( "==============================================");
System.out.println("对应的稀疏数组如下:");
for(int[] arr1 : sparseArray){
for(int x1 : arr1){
System.out.printf("\t"+x1);
}
System.out.println();
}
System.out.println("==============================================");
Ⅱ, 稀疏数组转换为原始二维数组
///用第一行的数据初始化二维数组的行,列数
int[][] arry_1 = new int[sparseArray[0][0]][sparseArray[0][1]];
///遍历稀疏数组,把行索引,列索引,以及有效值赋值给二维数组
for(int i=1; i<sparseArray.length; i++){
arry_1[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
打印输出原二维数组
for(int arr_2[] : arry_1){
for (int x_2 : arr_2){
System.out.printf("\t" +x_2);
}
System.out.println();
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)