关于java的稀疏数组

news2024/11/17 13:56:19

关于java的稀疏数组

我们在前面的文章中了解了冒泡排序和优化冒泡排序,在本篇文章中我们来介绍一下稀疏数组,我们学会了可以自己动手试一试😀

稀疏数组

在介绍稀疏数组之前,我们先来了解一下五子棋。

在这里插入图片描述

我们这里有一个11 x 11的棋盘,棋盘上有两个棋子,一黑一白,所以我们可以用我们之前学过的二维数组来表示。

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

黑色棋子代表1,白色棋子代表2,但是我们会发现,二维数组很多的默认值都是0,所以记录了很多没有意义的数据。

所以,可以通过压缩数组的方法,来解决次问题,这个就叫做稀疏数组

稀疏数组的介绍

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

2、稀疏数组的处理方法:

  • 记录数组一共有几行,有几列,有多少个不同的值
  • 把具有相同值的元素和行列以及值,记录在一个小规模的数组中,从而缩小了程序的规模。

3、举例说明:

  • 原始数组
0   0   0   22  0   0   15
0   11  0   0   0   17   0
  • 稀疏数组
||[0]  2  |   7 |   4 
--------|-----|-------    //意思就是,两行,七列,4个不相同的值。
[1]  0  |   3 |  22
[2]  0  |   6 |  15
[3]  1  |   1 |  11
[4]  1  |   5 |  17

4、我们用代码来写一下棋盘😎

  • **创建一个二维数组 **
  • 棋盘格式为11*11 没有棋子代表0 ,黑色为1,白色为2。
public class Demo
{
	public static void main(String[] args)
	{
		int[][] array1 = new int[11][11];
	}
}
  • 给数组赋值
public class Demo
{
	public static void main(String[] args)
	{
		int[][] array1 = new int[11][11];
		array1[1][2]=1;
		array1[2][3]=2;
	}
}
  • 遍历输出棋盘
public class ArraysDemo08 {
    public static void main(String[] args) {
        //创建一个二维数组  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();
        }       
    }
}

我们执行以下代码,看一下结果。

输出原始数组
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

进程结束.......
  • 转换为稀疏数组
  • 获取有效值个数
public class ArraysDemo08 {
    public static void main(String[] args) {
        //创建一个二维数组  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();
        }

        //转化为稀疏数组保存
        //获取有效值的个数
        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);
    }
}
  • 创建一个稀疏数组
 //稀疏数组
int[][] array2=new int[sum+1][3];

array2[0][0]=11;//行
        
array2[0][1]=11;//列
        
array2[0][2]=sum;//有效值
  • 遍历二维数组(非0的值存在稀疏数组中)输出稀疏数组。
public class ArraysDemo08 {
    public static void main(String[] args) {
        //创建一个二维数组  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();
        }

        //转化为稀疏数组保存
        //获取有效值的个数
        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);

        //稀疏数组
        int[][] array2=new int[sum+1][3];

        array2[0][0]=11;//行

        array2[0][1]=11;//列

        array2[0][2]=sum;//有效值

        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");
        }
    }
}

我们执行一下,就可以发现变成了我们上面介绍的样子。

输出原始数组
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	

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1371968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新手练习项目 4:简易2048游戏的实现(C++)

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#xff09; 目录 一、效果图二、代码&#xff08;带注释&#xff09;三、说明 一、效果图 二、代码&#xff08;带…

深度学习|交叉熵

文章目录 什么是交叉熵如何构造信息量的函数关于 C 1 C_1 C1​参数的选择关于 C 2 C_2 C2​参数的选择 一个系统的熵如何比较两个系统的熵交叉熵在神经网络中的应用参考 什么是交叉熵 熵是用来衡量一个系统的混乱程度&#xff0c;混乱程度也其实代表着整个系统内部的不确定性。…

Redis缓存使用问题

数据一致性 只要使用到缓存,无论是本地内存做缓存还是使用 redis 做缓存,那么就会存在数据同步的问题。 以 Tomcat 向 MySQL 中写入和删改数据为例,来解释数据的增删改操作具体是如何进行的。 我们分析一下几种解决方案, 1、先更新缓存,再更新数据库 2、先更新数据库,…

搭建Docker私有镜像服务器

一、前言 1、本文主要内容 基于Decker Desktop&Docker Registry构建Docker私有镜像服务器测试在CentOS 7上基于Docker Registry搭建公共Docker镜像服务器修改Docker Engine配置以HTTP协议访问Docker Registry修改Docker Engine配置通过域名访问Docker Registry配置SSL证书…

1分钟速通Webservice服务端和客户端

服务端实现&#xff1a; 我们随便实现一个简单服务&#xff0c;客户请求我们的服务&#xff0c;我们给客户返回响应的信息 WebService public class HelloServiceImpl implements HelloService {Overridepublic String getString(String name) {return "hello," n…

使用numpy处理图片——基础操作

大纲 准备工作图片像素大小修改透明度 numpy是一款非常优秀的处理多维数组的Python基础包。在现实中&#xff0c;我们最经常接触的多维数组相关的场景就是图像处理。本系列将通过若干篇对图像处理相关的探讨&#xff0c;来介绍numpy的使用方法&#xff0c;以获得直观的体验。 本…

主食冻干哪款好?十大放心主食冻干名单推荐

作为养猫的人&#xff0c;我们都知道每天最担心的事情就是如何为心爱的猫咪选择一款高品质的猫粮。我们都希望为猫咪提供最好的营养&#xff0c;让它们健康快乐地成长。然而&#xff0c;近期的一些事件&#xff0c;如百利猫粮生虫和VE主食冻干掰开有虫&#xff0c;让我们不得不…

【开源商城推荐-LGPL-3.0】ts-mall 聚惠星商城

dts-shop: 聚惠星商城 DTS-SHOP&#xff0c;基于 微信小程序 springboot vue 技术构建 &#xff0c;支持单店铺&#xff0c;多店铺入驻的商城平台。项目包含 微信小程序&#xff0c;管理后台。基于java后台语言&#xff0c;已功能闭环&#xff0c;且达到商用标准的一套项目体…

AI文本朗读应用(二)

调用api实现TTS 注&#xff1a;如对api的使用有任何疑问&#xff0c;可以查阅文本转语音 REST API。 选择右侧“解决方案资源管理器”中的“TTS_Demo”&#xff0c;右键选择“添加”->“新建项”。 选择“类”&#xff0c;名称为“Authentication.cs”&#xff0c;点击“添…

【漏洞复现】锐捷EG易网关cli.php后台命令执行漏洞

Nx01 产品简介 锐捷EG易网关是一款综合网关&#xff0c;由锐捷网络完全自主研发。它集成了先进的软硬件体系架构&#xff0c;配备了DPI深入分析引擎、行为分析/管理引擎&#xff0c;可以在保证网络出口高效转发的条件下&#xff0c;提供专业的流控功能、出色的URL过滤以及本地化…

14:00面试,14:07就出来了,问的问题有点变态。。。

前言 刚从小厂出来&#xff0c;没想到在另一家公司我又寄了。 在这家公司上班&#xff0c;每天都要加班&#xff0c;但看在钱给的比较多的份上&#xff0c;也就不太计较了。但万万没想到一纸通知&#xff0c;所有人不准加班了&#xff0c;不仅加班费没有了&#xff0c;薪资还…

Zustand 状态管理

Zustand 状态管理 安装创建 Store给 Store 添加TS类型约束在页面使用 Store返回 Store 中所有状态在 Store 中使用 async 异步方法使用 Immer Middleware (中间件) 更新深层嵌套的 State使用 get 方法&#xff0c;在 set 方法外访问 State 中的数据使用 selector什么是 selecto…

炫技作品!极好!独家原创!一种新型改进的蜣螂优化算法(CCCDBO)

炫技作品&#xff01;&#xff0c;独家原创&#xff01; 蜣螂优化算法DBO的含金量不用我多介绍了吧&#xff0c;这是和麻雀优化算法SSA同一个课题组出的算法&#xff0c;业内公认的比较好的算法&#xff0c;这个算法认可度很高&#xff01; 一种新型改进蜣螂优化算法&#xf…

【web缓存】nginx和CDN应用

目录 一、代理的工作机制 二、代理服务器的概念 三、代理服务器的作用 四、常用的代理服务器 五、nginx缓存代理部署 步骤一&#xff1a;首先脚本完成三台nginx的部署 步骤二&#xff1a;在两个后端原始服务器上分别创建测试页面 步骤三&#xff1a;完成nginx缓存服务器…

中央处理器CPU(2)---流水CPU与RISC

1.流水CPU &#xff08;一看到这个就想起老家的流水席了&#xff0c;不知道各位吃过没。&#xff09; &#x1f308;1.1并行处理技术 对于计算机来说不论如何发展&#xff0c;最重要的一个追求目标就是很高的运算速度&#xff0c;冯诺依曼机是&#xff0c;现代计算机依然是&…

高效实用的电商数据分析产品之店铺分析如何入手?

在电商行业&#xff0c;如何做好店铺分析&#xff1f;应该从哪几个方面进行&#xff1f; 1、寻找竞品店铺 在众多店铺中找到与自己风格&#xff08;定位/用户群体等&#xff09;相仿的相关竞争对手的标签。研究竞品店铺中爆款产品作为一个店铺运营&#xff08;新品开发等&…

HubSpot CRM:卓越客户服务的关键引擎

在数字化时代&#xff0c;提供卓越的客户服务是企业成功的关键之一。HubSpot CRM以其强大的功能和灵活性&#xff0c;成为实现卓越客户服务的关键引擎&#xff0c;以下是强调HubSpot CRM在客户服务中的应用的关键方面&#xff1a; 1. 全面的客户视图 HubSpot CRM集成了全面的…

解决:接口中返回的文本不能保持原本格式也无法换行

一、问题&#xff1a; 原本传入的文本是有换行的&#xff0c;但是用div展示接口返回的文本&#xff0c;所示内容没有保持原有格式没达到换行效果 以下是传入到接口的文本格式 使用div标签展示接口返回的文本&#xff0c;但并没有保持原有格式&#xff0c;文本也没换行 <di…

docker 容器添加指定网络地址

docker 容器添加指定网络地址 在搭建halo博客时&#xff0c;准备让 halo、mysql8.1、nginx 三个容器在同一个网段中&#xff0c;并指定IP。 实现docker内部容器之间网络互通。 查看容器网络信息命令 docker inspect 容器名各容器部署成功后网络效果如下&#xff1a; nginx …

城堡世界源码

随着数字技术的飞速发展和人们对于娱乐需求的不断提升&#xff0c;城堡世界源码开发逐渐成为了新的热门话题。城堡世界是一个集潮流、艺术、科技于一体的数字娱乐新领域&#xff0c;通过将虚拟现实、增强现实等技术融入传统玩具设计中&#xff0c;为玩家们带来了全新的互动体验…