每天一个数据结构之稀疏数组

Posted z啵唧啵唧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每天一个数据结构之稀疏数组相关的知识,希望对你有一定的参考价值。

稀疏数组
  • 稀疏数组的概念:当一个二维数组中有很多的默认值0的时候可以通过挤压数组的方式获得稀疏数组
  • 稀疏数组的第一行第一列记录原数组的总行数,第一行第二例记录原数组的总列数,第一行的第三列记录总的非0数的个数
  • 稀疏数组从第二行开始就开始记录每个非0数的位置和对应的值。

  • 二维数组转稀疏数组的思路

1、遍历原始的二维数组,得到有效的数据个数

2、根据sum就可以创建稀疏数组

3、将二维数组的有效数据存入到稀疏数组

  • 稀疏数组转二维数组的思路

1、先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组

2、在读系数数组的后面几行,并赋值给原始的二维数组即可

  • 代码实现一个二维数组转稀疏数组基于下面这个棋盘
/**
 * @Author 啵儿
 * @Email 1142172229@qq.com
 * @date 2021/10/31 22:22
 **/
public class Demo1 
    public static void main(String[] args) 
        /*
        * 创建一个数组
        * */
        System.out.println("二维数组~~~");
        int row = 11;//设置行为11
        int col = 11;//设置列为11
        int [][] arr1= new int[row][col];
        /*
        * 初始化非零行,1为黑子,2为蓝子
        * */
        arr1[1][2]=1;
        arr1[2][3]=2;
        int sum = 0;
        /*
        * 遍历数组
        * */
        for (int[] ints : arr1) 
            for (int anInt : ints) 
                System.out.print(anInt+"\\t");
            
            System.out.println();
        
       /*
       * 遍历二维数组找出非0元素的个数
       * */
        for(int i=0;i<row;i++)
        
            for(int j=0;j<col;j++)
            
                if (arr1[i][j]!=0)
                
                    sum++;
                
            
        

        /*
        * 创建一个稀疏数组行为3列为sum
        * */
        int m = 1;
        int n = 0;
        int [][] arr2 = new int[sum+1][3];
        for (int i = 0;i<row;i++)
        
            for (int j = 0;j<col;j++)
            
                if (arr1[i][j]!=0)
                
                    arr2[m][n]=i;
                    arr2[m][n+1]=j;
                    arr2[m][n+2]=arr1[i][j];
                    m++;
                

            
        
        /*
        * 初始化稀疏数组的第一行
        * */
        arr2[0][0]=row;
        arr2[0][1]=col;
        arr2[0][2]=sum;
        /*
        * 遍历稀疏数组
        * */
        System.out.println("稀疏数组~~~");
        for (int[] ints : arr2) 
            for (int anInt : ints) 
                System.out.print(anInt+"\\t");

            
            System.out.println();
        

    

  • 将上面的稀疏数组还原为二维数组
package com.zb.Test;

/**
 * @Author 啵儿
 * @Email 1142172229@qq.com
 * @date 2021/10/31 23:03
 **/

import java.util.Scanner;

/**
 * 稀疏数组转化为二维数组
 * **/
public class Demo2 
    public static void main(String[] args) 
        Scanner sc = new Scanner(System.in);
        /*
         * 先初始化一个稀疏数组
         * */
        int row = 11;
        int col = 11;
        int sum = 2;
        int [][]arr1 = new int[sum+1][3];
        /*
        * 给稀疏数组符值
        * */
        for (int i =0;i<sum+1;i++)
        
            for (int j = 0;j<3;j++)
            
                System.out.println("arr["+i+"]"+"["+j+"]=");
                arr1[i][j]=sc.nextInt();
            
        
        System.out.println("稀疏数组~~~");
        for (int[] ints : arr1) 
            for (int anInt : ints) 
                System.out.print(anInt+"\\t");
            
            System.out.println();
        
        /*
        * 接下来进行稀疏数组转二维数组
        * */

        /*
        * 初始化一个二维数组
        * */
        int [][]arr2 = new int[row][col];
        /*
        * 1、遍历稀疏数组,将值赋给二维数组
        * 2、稀疏数组上的每一行代表二维数组上的一个数字
        * 3、行需要遍历,列没次从零开始
        * */
        for (int i=1;i<sum+1;i++)
        
                int j=0;
                arr2[arr1[i][j]][arr1[i][j+1]]=arr1[i][j+2];
        
        System.out.println("二维数组~~~");
        for (int[] ints : arr2) 
            for (int anInt : ints) 
                System.out.print(anInt+"\\t");
            
            System.out.println();
        

    


以上是关于每天一个数据结构之稀疏数组的主要内容,如果未能解决你的问题,请参考以下文章

数据结构之二维数组与稀疏数组的转换

Java数据结构和算法之稀疏数组

Java数据结构预算法之稀疏数组

数据结构与算法之java语言实现:稀疏数组

数据结构之稀疏数组

golang数据结构之稀疏数组