【数据结构】稀疏数组 --- 应用场景,转换的思路分析,代码实现
2022/7/30 23:27:25
本文主要是介绍【数据结构】稀疏数组 --- 应用场景,转换的思路分析,代码实现,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
楔子:
- 数据结构包括线性结构和非线性结构。
1、线性结构:
1) 线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系
2) 线性结构有两种不同的存储结构,即顺序存储结构(数组)和链式存储结构(链表)。顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的
3) 链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息
4) 线性结构常见的有:数组、队列、链表和栈,后面我们会详细讲解
2、非线性结构:
非线性结构包括:二维数组,多维数组,广义表,树结构,图结构
稀疏数组:
1、需求:
编写的五子棋程序中,有存盘退出和续上盘的功能,因为该二维数组(棋盘)的很多值是默认值0(代表没有棋子), 因此记录了很多没有意义的数据 ---> 稀疏数组。
2、基本介绍:
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
3、稀疏数组的处理方法是:
1)记录数组一共有几行几列,有多少个不同的值
2)把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
4、应用实例:
1) 使用稀疏数组,来保留二维数组(棋盘、地图等等)
2) 把稀疏数组存盘,并且可以从新恢复原来的二维数组数组。
3) 代码实现:
package org.burning.sparsearray; public class SparseArray { public static void main(String[] args) { /* 创建一个原始的二维数组 11 * 11 0: 表示没有棋子 1 表示黑子 2 表蓝子 */ int chessArr1[][] = new int[11][11]; chessArr1[1][2] = 1; chessArr1[2][3] = 2; chessArr1[4][5] = 2; // 输出原始的二维数组 System.out.println("原始的二维数组:"); for (int[] row : chessArr1) { for (int data : row) { System.out.printf("%d\t", data); } System.out.println(); } //将二维数组转换为稀疏数组: // 1. 先遍历二维数组,得到非0数据的个数 int sum = 0; for (int i = 0; i < 11; i++) { for (int j = 0; j < 11; j++) { if (chessArr1[i][j] != 0) { sum++; } } } // 2. 创建对应的稀疏数组 int sparseArr[][] = new int[sum + 1][3]; //给稀疏数组赋值 sparseArr[0][0] = 11; sparseArr[0][1] = 11; sparseArr[0][2] = sum; // 遍历二维数组,将非0的值存放到 sparseArr中 int count = 0; //count 代表当前行 for (int i = 0; i < 11; i++) { for (int j = 0; j < 11; j++) { if (chessArr1[i][j] != 0) { count++; sparseArr[count][0] = i; sparseArr[count][1] = j; sparseArr[count][2] = chessArr1[i][j]; } } } //输出稀疏数组 System.out.println(); System.out.println("稀疏数组为:"); for (int i = 0; i < sparseArr.length; i++) { System.out.printf("%d\t%d\t%d\t\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]); } System.out.println(); /* 将稀疏数组 --> 恢复成原始二维数组 1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组 2. 在读取稀疏数组后几行的数据,并赋给原始的二维数组即可. */ //1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组 int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]]; //2. 在读取稀疏数组后几行的数据(从第二行开始),并赋给原始的二维数组即可 for (int i = 1; i < sparseArr.length; i++) { chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2]; } // 输出恢复后的二维数组 System.out.println(); System.out.println("恢复后的二维数组:"); for (int[] row : chessArr2) { for (int data : row) { System.out.printf("%d\t", data); } System.out.println(); } } }
控制台:
原始的二维数组: 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 稀疏数组为: 11 11 3 1 2 1 2 3 2 4 5 2 恢复后的二维数组: 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Process finished with exit code 0
这篇关于【数据结构】稀疏数组 --- 应用场景,转换的思路分析,代码实现的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南