zoukankan      html  css  js  c++  java
  • 关于稀疏数组

    一、为什么用稀疏数组?

    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+"	");
      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	%d	%d	
    ",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+"	");
     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锁定行

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

  • 相关阅读:
    <转>浅谈DNS体系结构:DNS系列之一
    SOA和NS区别
    《浅析各类DDoS攻击放大技术》
    《转》DNS放大攻击
    Linux创建公钥
    MATLAB 中有哪些命令,让人相见恨晚
    SQL中的declare用法
    SQl server 附加数据库失败如何解决
    VS中代码对齐等快捷键
    C#窗口控件Dock的位置顺序调整方法
  • 原文地址:https://www.cnblogs.com/han200113/p/11515327.html
Copyright © 2011-2022 走看看