当前位置: 首页 > news >正文

6.8 稀疏数组

6.8 稀疏数组

稀疏数组是一种数据结构,在程序中数据结构的思想,是非常重要的。例如

  • 需求:编写五子棋游戏中,有存盘退出和续上盘的功能。
  • 分析问题:因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据,当存盘退出的时候,棋盘上有大量的默认值,存储没有必要。也是是我们可以编写一个压缩算法让我们的存储更为高效,也就是我们要学习的稀疏数组

一、稀疏数组介绍

当一个数组中大部分元素为0,或者为同一值的数组时,可以利用稀疏数组来保存该数组。

  • 稀疏数组的处理方式是:

    1. 记录数据一共有几行几列,有多少个不同的值
    2. 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
  • 如图,左边是原始数组,右边是稀疏数组

    稀疏数组

示例

package com.baidu.www.array;public class ArrayDemo08 {public static void main(String[] args) {//1、创建一个二维数组11*11 0代表没有棋子,1:黑棋,2:白棋int[][] array1 = new int[11][11];array1[1][2] = 1;array1[2][3] = 2;//输出原始的数组System.out.println("输出原始的数组");for(int[] ints : array1 ){for (int anInt: ints) {System.out.print(anInt+"\t");}System.out.println();}System.out.println("====================================");//转换为稀疏数组保存//1、获取有效值的个数int sum = 0;for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {if(array1[i][j]!=0){sum++;}}}System.out.println("有效值的个数为"+sum);//2、创建一个稀疏数组的数组int[][] array2 = new int[sum+1][3];//根据有效值的个数加一就能确定稀疏数组的行数array2[0][0]=11;array2[0][1]=11;array2[0][2]=sum;//3、遍历二维数组,将非零的值,存放稀疏数组中int count = 0;for (int i = 0; i < array1.length; i++) {for (int j = 0; j < array1[i].length; j++) {if(array1[i][j]!=0){count++;//有了这个我们就知道里面存了多少个数字array2[count][0]=i;array2[count][1]=j;array2[count][2]=array1[i][j];}}}//输出稀疏数组System.out.println("输出稀疏数组");for (int i = 0; i < array2.length; i++) {System.out.println(array2[i][0] + "\t" + array2[i][1] + "\t" + array2[i][2] + "\t");}System.out.println("====================================");System.out.println("还原稀疏数组");//相当于根据稀疏数组重新构建一个新的数组//1、先读取稀疏数组的值,定义一个新的数组int[][] array3 = new int[array2[0][0]][array2[0][1]];//2、给其中的元祖还原它的值for (int i = 1; i < array2.length; i++) {array3[array2[i][0]][array2[i][1]]=array2[i][2];}//3、输出还原后的数组System.out.println("输出还原的数组");for(int[] ints : array3 ){for (int anInt: ints) {System.out.print(anInt+"\t");}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	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	0	
====================================
有效值的个数为2
输出稀疏数组
11	11	2	
1	2	1	
2	3	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	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	0	Process finished with exit code 0*/
http://www.lryc.cn/news/106471.html

相关文章:

  • ROS版本的ORB-SLAM3用RealSense D455相机实时运行测试
  • Vue中对对象内容调用的Demo
  • 语音识别 — 特征提取 MFCC 和 PLP
  • BES 平台 SDK之按键的配置
  • 【Golang系统开发】搜索引擎(1) 如何快速判断网页是否已经被爬取
  • 记录--一个好用的轮子 turn.js 实现仿真翻书的效果
  • 《Spring Boot源码解读与原理分析》书籍推荐
  • C++ 什么时候使用 vector、list、以及 deque?
  • 视频创作者福音,蝰蛇峡谷NUC12SNKI7视频剪辑测评
  • 使用Qt中的QDir类进行目录操作
  • qt服务器 网络聊天室
  • meanshift算法通俗讲解【meanshift实例展示】
  • 正交变换和仿射变换
  • Electron 多端通信桥 MessageChannelMain和 MessagePortMain 坑点汇集
  • Html5播放器按钮在移动端变小的问题解决方法
  • Rust 开发环境搭建【一】
  • C# Blazor 学习笔记(3):路由管理
  • int[]数组转Integer[]、List、Map「结合leetcode:第414题 第三大的数、第169题 多数元素 介绍」
  • vue子传父的一种新方法:this.$emit(‘input‘, value)可实现实时向父组件传值
  • 【Web】web
  • css中的bfc是什么?
  • 【前端知识】React 基础巩固(四十四)——其他Hooks(useContext、useReducer、useCallback)
  • 华为云hcip核心知识笔记(数据库服务规划)
  • 【有趣的】关于Map的一些小测试
  • 【MATLAB第63期】基于MATLAB的改进敏感性分析方法IPCC,拥挤距离与皮尔逊系数法结合实现回归与分类预测
  • AI 绘画Stable Diffusion 研究(二)sd模型ControlNet1.1 介绍与安装
  • 接口参数设计原则
  • 网络安全防护利器:SK5代理与IP代理的技术对比
  • IDEA删除本地git仓库、创建本地git仓库、关联其他仓库并上传
  • JavaEE简单示例——在使用Tomcat的时候可能出现的一些报错