关于java的稀疏数组

关于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,白色为2int[][] 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,白色为2int[][] 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,白色为2int[][] 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.mzph.cn/news/613719.shtml

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

相关文章

虚拟机Linux硬盘扩容

扩容前(20G)&#xff1a; 扩容后(60G)&#xff1a; 步骤&#xff1a; 1. 点击 虚拟机 -> 设置 -> 硬件 -> 硬盘(SCSI) -> 扩展(E)... -> 输入想要扩容大大小 -> 扩展(E) 2. 运行虚拟机&#xff0c;查看根目录属于那个文件系统&#xff0c;我的是 /dev/sda1…

Android 车联网——CarDiagnosticService介绍(十八)

一、简介 CarDiagnosticService 是安卓汽车平台中的一个服务,用于监测和分析车辆的诊断数据。这个服务旨在帮助汽车制造商和开发人员实时收集和分析车辆传感器、系统状态等数据,从而检查系统故障、进行远程诊断、优化车辆性能。 主要功能 实时数据收集和分析:该服务可以收集…

【Linux】执行脚本的两种方法,sh xx.sh和直接./xx.sh的区别

这里写自定义目录标题 背景&#xff1a;1. 使用 sh /home/test.sh2. 使用 /home/test.sh总结 背景&#xff1a; 我有个test.sh在/home/目录里 1. 使用 sh /home/test.sh 这种方式是显式地使用 sh 命令&#xff08;Shell&#xff09;来运行脚本。 这意味着脚本将在 sh 环境中…

华为OD机试真题-最长子字符串的长度(二)-2023年OD统一考试(C卷)

题目描述: 给你一个字符串 s,字符串s首尾相连成一个环形 ,请你在环中找出l、o、x 字符都恰好出现了偶数次最长子字符串的长度。 输入描述: 输入是一串小写的字母组成的字符串。 输出描述: 输出是一个整数 补充说明: 1 <= s.length <= 5 x 10^5 s 只包含小写英文字母…

Unity编辑器扩展(外挂)

每日一句:未来的样子藏在现在的努力里 目录 什么是编译器开发 C#特性[System.Serializable] 特殊目录 命名空间 /*检视器属性控制*/ //添加变量悬浮提示文字 //给数值设定范围&#xff08;最小0&#xff0c;最大150&#xff09; //指定输入框&#xff0c;拥有5行 //默认…

自然语言处理-用于预训练词嵌入的数据集

word2vec模型的技术细节和大致的训练方法&#xff0c;让我们来看看它们的实现。具体地说&#xff0c;用于预训练词嵌入模型的数据集开始&#xff1a;数据的原始格式将被转换为可以在训练期间迭代的小批量。 import math import os import random import torch from d2l import…

Sqlite3相关返回值

SQLite 是一个开源的嵌入式关系数据库&#xff0c;广泛应用于各种软件项目中。在执行数据库操作时&#xff0c;SQLite 会返回一个结果代码&#xff0c;以表示操作的成功或失败。这些结果代码是整数&#xff0c;每个代码都对应一个特定的含义。 以下是 SQLite 返回的结果代码及…

力扣labuladong——一刷day90

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Trie树实现 前言 Trie 树又叫字典树、前缀树、单词查找树&#xff0c;是一种二叉树衍生出来的高级数据结构&#xff0c;主要应用场景是处理字符串前缀相关的…

strlen/Memcpy_s/strncasecmp

strlen 声明&#xff1a;size_t strlen(const char *str) 举例&#xff1a; #include <stdio.h> #include <string.h>int main () {char str[50];int len;strcpy(str, "This is runoob.com");len strlen(str);printf("|%s| 的长度是 |%d|\n"…

软件测试|使用Pytest、Allure Step和Allure Attach创建详细测试报告

引言 在软件开发过程中&#xff0c;测试是不可或缺的一部分。为了更好地展示测试结果并定位问题&#xff0c;结合Pytest测试框架和Allure测试报告工具可以创建清晰、详细的测试报告。本文将介绍如何使用Pytest、Allure的allure.step()和allure.attach()功能来创建具有丰富信息…

笔记-管理的实践》商业/企业的目的和功能

笔记 From《管理的实践》彼得德鲁克 企业的目的 企业的目的&#xff0c;只有一个正确而有效的定义&#xff1a;“创造顾客”。 市场不是由上帝、大自然或经济力量创造的&#xff0c;而是由企业家创造的。 企业的功能 由于企业的目的是创造顾客&#xff0c;任何企业都有两个基…

springboot 物业管理系统

springboot mysql mybatisthymeleaf 基础信息管理 房屋信息 用户信息 业主信息 租房信息 公告管理 日常管理 财务管理

快速排序-排序算法

算法思想 快速排序采用的仍然是分治的思想。 Step1.每次在无序的序列中选取一个基准数。 Step2.然后将大于和小于基准数的元素分别放置于基准数两边。&#xff08;前面部分的元素均小于或等于基准数&#xff0c;后面部分均大于或等于基准数&#xff09; Step3.然后采用分治法&…

代码随想录——字符串 刷题记录

344.反转字符串 交换&#xff0c;没有难点 541.反转字符串II 注意题干是“每2k”次&#xff0c;所以要有循环 在对剩余的处理中&#xff0c;要先检查每次的剩余数量&#xff0c;包括第一次&#xff0c;所以应该先计算剩余多少决定怎么交换&#xff0c;如果剩余多余2k再进行前…

Docker(网络,网络通信,资源控制,数据管理,CPU优化,端口映射,容器互联)

docker网络 网络实现原理 Docker 网络是指由 Docker 为应用程序创建的虚拟环境的一部分&#xff0c;它允许应用程序从宿主机操作系统的网络环境中独立出来&#xff0c;形成容器自有的网络设备、IP 协议栈、端口套接字、IP 路由表、防火墙等与网络相关的模块。Docker 的网络功能…

预训练中文GPT2(包括重新训练tokenizer)

训练数据 1.json后缀的文件 2.数据是json line格式&#xff0c;一行一条json 3. json结构如下 {"content": "①北京和上海户籍的游客可获得韩国多次签证&#xff1b;②“整容客”可以不经由韩国使领馆、直接在网上申请签证&#xff1b;③中泰免签的实施日期…

C++ 深度优先搜索DFS || 模版题:排列数字

给定一个整数 n &#xff0c;将数字 1∼n 排成一排&#xff0c;将会有很多种排列方法。 现在&#xff0c;请你按照字典序将所有的排列方法输出。 输入格式 共一行&#xff0c;包含一个整数 n 。 输出格式 按字典序输出所有排列方案&#xff0c;每个方案占一行。 数据范围 1…

前端页面优化做的工作

1.分析模块占用空间 new (require(webpack-bundle-analyzer).BundleAnalyzerPlugin)() 2.使用谷歌浏览器中的layers&#xff0c;看下有没有影响性能的模块&#xff0c;或者应该销毁没销毁的 3.由于我们页面中含有很大的序列帧动画&#xff0c;所以会导致页面性能低&#xff0…

质量好洗地机有哪些?洗地机口碑榜

在很多人眼中&#xff0c;洗地机可能被简单地视为一种高价的拖把&#xff0c;但作为一个经验丰富的洗地机测评博主&#xff0c;我要强调洗地机在家务工作中的巨大价值。它不仅仅是一种清洁工具&#xff0c;更是集扫地、拖地、洗地以及擦干地板等多项功能于一身的强大设备。通过…

Transformer从菜鸟到新手(六)

引言 上篇文章介绍了如何在多GPU上分布式训练&#xff0c;本文介绍大模型常用的一种推理加速技术——KV缓存。 KV Cache KV缓存(KV Cache)是在大模型推理中常用的一种技巧。我们知道在推理阶段&#xff0c;Transformer也只能像RNN一样逐个进行预测&#xff0c;也称为自回归。…