稀疏数组转换思路及代码实现
基本功能
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
处理方法
- 记录数组一共有几行几列,有多少个不同的值
- 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
如图,把一个6X7的二维数组变为了一个9X3的稀疏数组。其中
- 第一行保存的是原二维数组的行、列以及非0值的个数
- 第二到九行保存的是每个非0值所在的位置及其数值
转换思路
二维数组转稀疏数组
- 遍历二维数组,得到二维数组中有效值的个数sum
- 创建稀疏数组,有sum+1行,3列(固定)
- 将二维数组中的有效值存入稀疏数组中
稀疏数组转二维数组
- 先读取稀疏数组的第一行(保存二维数组的行列信息),还原二维数组
- 读取稀疏数组的其他行,将值赋给二维数组的对应位置上的数
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | public class SparseArray { public static void main(String[] args) { int chessboardArray1[][] = new int [ 11 ][ 11 ]; //给原数组里面放入值 chessboardArray1[ 0 ][ 1 ] = 1 ; chessboardArray1[ 1 ][ 2 ] = 2 ; chessboardArray1[ 2 ][ 3 ] = 3 ; System.out.println( "这是原数组:" ); for ( int [] row : chessboardArray1) { for ( int data : row){ System.out.print(data+ "\t" ); } System.out.println(); } //求稀疏数组 System.out.println( "=========================================" ); System.out.println( "这是稀疏数组:" ); //先找出其中的非0数据 int num = 0 ; for ( int i = 0 ; i< 11 ; i++){ for ( int j = 0 ; j< 11 ; j++){ if (chessboardArray1[i][j] != 0 ){ num++; } } } //求出稀疏数组的第一行数据 int sparseArray[][] = new int [num+ 1 ][ 3 ]; sparseArray[ 0 ][ 0 ] = chessboardArray1.length; sparseArray[ 0 ][ 1 ] = chessboardArray1[ 0 ].length; sparseArray[ 0 ][ 2 ] = num; ////再次遍历二维数组,将有效值存入稀疏数组 int count = 1 ; for ( int i = 0 ; i<chessboardArray1.length; i++){ for ( int j = 0 ; j<chessboardArray1[ 0 ].length; j++){ if (chessboardArray1[i][j] != 0 ){ sparseArray[count][ 0 ] = i; sparseArray[count][ 1 ] = j; sparseArray[count][ 2 ] = chessboardArray1[i][j]; count++; } } } //遍历稀疏数组 for ( int i = 0 ; i<sparseArray.length; i++){ for ( int j = 0 ; j<sparseArray[ 0 ].length; j++){ System.out.print(sparseArray[i][j]+ "\t" ); } System.out.println(); }<br> //将稀疏数组还原 System.out.println( "=========================================" ); System.out.println( "把稀疏数组还原为原数组:" ); //先得到二维数组的行列数 int chessboardArray2[][] = new int [sparseArray[ 0 ][ 0 ]][sparseArray[ 0 ][ 1 ]]; //遍历稀疏数组,同时给二维数组赋值 for ( int i = 1 ; i<sparseArray.length; i++){ chessboardArray2[sparseArray[i][ 0 ]][sparseArray[i][ 1 ]] = sparseArray[i][ 2 ]; } //打印二维数组 for ( int [] row : chessboardArray2){ for ( int data : row){ System.out.print(data+ "\t" ); } System.out.println(); } } } |
运行结果
本文来自博客园,作者:腹白,转载请注明原文链接:https://www.cnblogs.com/wyh518/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?