一,二, 数据结构框架, Java实现稀疏数组

一, 数据结构

二, 稀疏数组

2.1 定义和栗子

  • 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
  • 稀疏数组的表示方法
  1. 记录数组一共有几行几列,有多少个不同的值
  2. 把二维数组的值,以及所处的行索引,列索引记录下来存储到一张规模较小的表中.(注意: 索引都是从0开始,对应的行,列数要+1哦)
  • 举个栗子:

2.2 编程实现

2.2.1 思想

Ⅰ, 二维数组转换为稀疏数组的思路

  1. 遍历原始的二维数组, 得到有效数据的数量 count;
  2. 根据 count 就可以创建稀疏数组 sparseArr int[sum+1][3]
  3. 将二维数组的有效数据存入到稀疏数组中.

Q:为什么 count+1 ?

因为稀疏数组的第一行存储总行数,总列数,以及总共的有效值数.从第二行开始才存储有效值;

Ⅱ, 稀疏数组转原始二维数组的思路

  1. 直接访问稀疏数组第一行的数据,以此创建原始的二维数组;
  2. 再遍历读取稀疏数组后几行的数组,并赋给原始的二维数组即可.

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();
        }
    }
}

在这里插入图片描述

posted @ 2022-05-26 20:31  青松城  阅读(24)  评论(0编辑  收藏  举报