关于稀疏数组

一、为什么用稀疏数组?

image

比如这个棋盘,如果要记录黑蓝棋子的位置首先会想到运用二维数组,我们把二维数组建好后(1是黑,2是蓝),发现很多空白位置浪费了大量的内存空间

我们这个时候可以用稀疏数组来存储“有效数据

二、怎么使用稀疏数组

image

稀疏数组一共有三列(列固定),分别表示行号,列号和值

                              第一行:记录初始数组的行、列、有效值(有意义的值)

                              其他行:逐次记录有效值的行号、列号和值

由图可知,稀疏数组总行数为有效值(假设有效值为num)num+1,列数为3

三、代码实现

数组转稀疏思路:

  • 先定义好一个数组,并赋值
  • 遍历数组,获取有效值个数num
  • 定义稀疏数组,行数为num+1,列数为3,为数组第一行赋值
  • 再次遍历初始数组,获取有效值,赋值给稀疏数组
  • 定义完成

稀疏数组转二维数组:

  • 定义二维数组,行和列从稀疏数组第一行读取
  • 设置循环,根据稀疏数组后几行来恢复

代码:

  1 int[][] array1=new int[11][11];
  2 //为数组赋值,1是黑色,2是蓝色
  3 array1[1][2]=1;
  4 array1[2][3]=2;
  5 //遍历数组
  6 for (int[] row:array1) {
  7     for (int item:row) {
  8         System.out.print(item+"\t");
  9     }
 10     System.out.println();
 11 }
 12 int num=0;
 13 //再次遍历数组,找出实际存在的数有几个
 14 for (int i=0;i<11;i++){
 15     for (int j=0;j<11;j++){
 16         if (array1[i][j]!=0){
 17             num++;
 18         }
 19     }
 20 }
 21 System.out.println("num="+num);
 22 
 23 //开始定义稀疏数组
 24 int[][] Sparse_array=new int[num+1][3];
 25 Sparse_array[0][0]=11;
 26 Sparse_array[0][1]=11;
 27 Sparse_array[0][2]=num;
 28 
 29 //再次遍历为稀疏数组赋值
 30 int count=0;
 31 for (int i=0;i<11;i++){
 32     for (int j=0;j<11;j++){
 33         if (array1[i][j]!=0){
 34             count++;
 35             Sparse_array[count][0]=i;
 36             Sparse_array[count][1]=j;
 37             Sparse_array[count][2]=array1[i][j];
 38         }
 39     }
 40 }
 41 
 42 //输出稀疏数组
 43 System.out.println("+++++++++++++++++++++稀疏数组++++++++++++++");
 44 for (int i=0;i<Sparse_array.length;i++){
 45     System.out.printf("%d\t%d\t%d\t\n",Sparse_array[i][0],Sparse_array[i][1],Sparse_array[i][2]);
 46 }
 47 System.out.println();
 48 
 49 //稀疏数组恢复
 50 int[][] array2=new int[Sparse_array[0][0]][Sparse_array[0][1]];
 51 //为稀疏数组循环并赋值
 52 for (int i=1;i<Sparse_array.length;i++){
 53     array2[Sparse_array[i][0]][Sparse_array[i][1]]=Sparse_array[i][2];
 54 }
 55 
 56 //显示恢复的数组
 57 System.out.println("++++++++++++++++++恢复的数组+++++++++++++++");
 58 for (int[] row:array2){
 59     for (int item:row){
 60         System.out.printf(item+"\t");
 61     }
 62     System.out.println();
 63 }
 64 
 65 

关于为稀疏数组赋值理解:

count++;
Sparse_array[count][0]=i;
Sparse_array[count][1]=j;
Sparse_array[count][2]=array1[i][j];

为什么用count?

  

 我们是用循环逐行赋值的,为一行赋值时,只有列会变,所以定义一个count锁定行

文章是看完尚学堂的韩顺平老师稀疏数组的课后写的,写下来希望加强下记忆

猜你喜欢

转载自www.cnblogs.com/han200113/p/11515327.html
今日推荐