每天一个数据结构之稀疏数组
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();
以上是关于每天一个数据结构之稀疏数组的主要内容,如果未能解决你的问题,请参考以下文章