首页 > 编程语言 >稀疏数组__Java演示

稀疏数组__Java演示

时间:2024-09-10 10:14:37浏览次数:1  
标签:__ 演示 落子 int System 数组 sparseArr Java 棋盘

数据结构是一种数据组织、管理和存储的格式。常见的有数组、栈、队列、链表、树、图、堆、哈希表……

当需要记录一盘五子棋对弈的数据时,通常可以采用二维数组来实现,显然直接使用二维数组来存储数据有浪费memory的嫌疑,因为棋盘上很多点位没有落子,这些冗余数据也被记录了。

 

9x9棋盘

 

因此我们可以将类似的二维数组抽象成稀疏数组的结构,来储存数据。

稀疏数组通过仅记录非零(或非特定值)元素的位置和值,来大幅减少存储空间的需求,并提升数据处理的效率。

 

抽象后的稀疏数组

 

稀疏数组第一行,分别记录了棋盘的行size、列size、落子的总步数totalMoves

此后的每行,分别记录了落子的行index、列index、落子的当前步数move(根据move值的奇偶性来区分黑子或白子,如果棋盘是按落子顺序记录的话)。

至此,我们可以看到在类似场景中,稀疏数组减少了不必要的存储空间,提高了数据处理速度。

查看代码
 public static void main(String[] args) {
        // 9x9棋盘
        int[][] chase = new int[8][8];
        chase[1][1] = 1; // 第一步落子
        chase[2][2] = 2; // 第二步落子
        // 打印棋盘
        for (int[] innerArr : chase) {
            for (int point : innerArr) {
                System.out.printf("%d\t", point);
            }
            System.out.println();
        }

        System.out.println("\n-----------------\n");

        // 构建稀疏数组sparseArr,以记录棋盘的表头 (第一行,棋盘的行size,棋盘的列size,落子的总步数totalMoves) 和每一步落子 (第n行,落子的行index,落子的列index,落子的步数move) ,共计3行
        int totalMoves = 0;
        for (int[] innerArr : chase) {
            for (int point : innerArr) {
                if (point != 0) {
                    totalMoves++;
                }
            }
        }
        int[][] sparseArr = new int[totalMoves + 1][3];
        // 第一行
        sparseArr[0][0] = chase.length;
        sparseArr[0][1] = chase[0].length;
        sparseArr[0][2] = totalMoves;
        // 第一步落子
        sparseArr[1][0] = 1;
        sparseArr[1][1] = 1;
        sparseArr[1][2] = 1;
        // 第二步落子
        sparseArr[2][0] = 2;
        sparseArr[2][1] = 2;
        sparseArr[2][2] = 2;
        // 打印稀疏数组
        for (int[] inner : sparseArr) {
            System.out.printf("%d\t%d\t%d\n", inner[0], inner[1], inner[2]);
        }

        System.out.println("\n-----------------\n");

        // 根据稀疏数组还原棋盘
        int[][] newChase = new int[sparseArr[0][0]][sparseArr[0][1]];
        for (int i = 1; i < sparseArr.length; i++) {
            newChase[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }
        // 打印还原的新棋盘
        for (int[] inner : newChase) {
            for (int e : inner) {
                System.out.printf("%d\t", e);
            }
            System.out.println();
        }
    }

 

标签:__,演示,落子,int,System,数组,sparseArr,Java,棋盘
From: https://www.cnblogs.com/ashet/p/18405896

相关文章

  • 事业单位考试日程记录
    下半年事业单位联考,2024届毕业生可以报考,25届应届生不具备报考资格;选调生考试、事业单位进校园专项考试,仅面向2025届应届生群体;如果考试公告的标题是“2025”开头的,那就意味着是2025年的考试,2025届应届生群体就可以报考;7月份开始!2025年考公考编上岸时间节点尽快了解......
  • 校验
    /***邮箱*@param{*}s*/exportfunctionisEmail(s){return/^([a-zA-Z0-9._-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(s)}exportconstpattern={//正数isPositive:/^(0|[1-9][0-9]{0,9})(\.[0-9]{1,4})?$/,//万元用的正则is......
  • 安装mayavi命令,使用cxfreeze打包python脚本
    pipinstallnumpy出现Anewreleaseofpipisavailable:23.2.1->24.2输入:python-mpipinstall--upgradepipsetuptoolswheelpipinstallPyQt5pipinstallvtkpipinstallmayavipipinstallscipypipinstallconfigobj 查看当前项目的依赖包:pipfr......
  • grafana重复面板
    关于Grafana重复面板的问题,我之前给过以下答案:Grafana中可以通过模板变量(Variables)和重复功能来动态生成多个面板,这对类似的面板进行数据展示非常有用。你可以通过如下步骤来实现:1.创建模板变量(变量管理)在Grafana仪表板上,点击面板顶部的齿轮图标(DashboardSettings)->......
  • SignalR实时消息推送
    后端创建一个Hub类,重写连接和断连方法ChatHub记录下每一位登录人连接SignalR的信息至Redis中引用的Microsoft.AspNetCore.App框架publicclassChatHub:Hub{//ConcurrentDictionary<string,HubUser>concurrentDictionary=newConcurrentDictionary<string,HubU......
  • 【运维自动化-配置平台】平台管理功能如何使用
    蓝鲸智云配置平台,以下简称配置平台配置平台里的平台管理功能是管理员的一些操作,比如一些全局纬度的设置1、全局配置-业务通用业务快照名称:通常不需要修改,保持平台搭建好默认业务(蓝鲸)即可拓扑最大可见层级:可根据实际业务场景自定义调整,需要注意的是,这个是全局的调整,针对每个......
  • 几种并发模式的实现
    常见的几个需要并发的场景,具体的实现方式asyncio异步并发importasyncioasyncdeftask(id,delay):awaitasyncio.sleep(delay)returnf"Task{id}completed"asyncdefmain():tasks=[task(1,2),task(2,1),task(3,3)]done,pending=await......
  • 2-7Java接口
    Java接口接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法......
  • TCP和UDP
    TCP(TransmissionControlProtocol,传输控制协议)和UDP(UserDatagramProtocol,用户数据报协议)是两种常用的网络传输层协议,它们在网络通信中扮演着重要的角色。以下是它们的主要区别:连接性:TCP:是一种面向连接的协议。在数据传输开始之前,必须建立一个连接,通过三次握手过程来确保......
  • 箱包工厂管理ERP对企业的意义是什么
     在当今竞争激烈的商业环境中,企业不断寻求高效、精确的管理工具以保持竞争力。对于箱包制造业而言,引入专业的ERP系统如万达宝箱包工厂管理ERP,是实现这一目标的重要步骤。pcbuksd这种定制化的ERP解决方案为企业带来的益处多方面且深远,它不仅优化了生产流程,还提高了资源利用效率,增......