本文源码:GitHub·点这里 || GitEE·点这里

一、基本简介

1、基础概念

在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵。定义非零元素的总数比上矩阵所有元素的总数为矩阵的稠密度。

2、处理方式

1)、记录数组一共有几行几列,有多少个不同的值
2)、把具有不同值的元素的行列及值记录在稀疏数组中,可以缩小程序代码的复杂度。

3、图解描述

稀疏数组表示
[0] 3 4 4 二维数组,3行,4列,4个非0的值;
[1] 1 2 2 一行,2列的值是2;
[2] 1 3 3 一行,3列的值是3;
…以此类推

4、五子棋场景

使用稀疏数组描述
行 列 值
[0] 11 11 2
[1] 1 2 1
[2] 2 3 2

二、代码实现

1、转换流程

二维数组转稀疏数组


1)、遍历二维数组,得到非零元素的个数
2)、创建稀疏数组
3)、二维数组的非零元素写入稀疏数组

稀疏数组转二维数组

1)、读取稀疏数组的首行,创建二维数组
2)、根据稀疏数组描述的有效元素,给二维数组赋值

2、代码实现

1)、核心流程

1、棋盘:基于二维数组
2、二维数组转稀疏数组
3、稀疏数组转二维数组

2)、方法一:生成二维数组

public static int[][] printChess (){
// 二维数组表示 11 * 11 的棋盘,0表示没有棋,1表示 黑, 2 表示蓝
int chessArray[][] = new int[11][11];
chessArray[1][2] = 1;
chessArray[2][3] = 2;
for (int[] row : chessArray) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
return chessArray ;
}

3)、方法二:转为稀疏数组

public static int[][] convertTwoArray (int chessArray[][]){
// 有效元素:先遍历二维数组 得到非0数据的个数
int unZeroSum = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (chessArray[i][j] != 0) {
unZeroSum++;
}
}
}
// 行:有效元素+1,列:3列
int sparseArray[][] = new int[unZeroSum+1][3] ;
sparseArray[0][0] = 11 ;// 0行0列值:11
sparseArray[0][1] = 11 ;// 0行1列值:11
sparseArray[0][2] = unZeroSum ;// 0行2列值:unZeroSum
// 遍历二维数组,将非0的值存放到稀疏数组中
// unZeroCount 用于记录是第几个非0数据,也就是稀疏数组的行
int unZeroCount = 0; //
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (chessArray[i][j] != 0) {
unZeroCount++;
sparseArray[unZeroCount][0] = i;
sparseArray[unZeroCount][1] = j;
sparseArray[unZeroCount][2] = chessArray[i][j];
}
}
}
// 输出稀疏数组的形式
for (int i = 0; i < sparseArray.length; i++) {
System.out.printf("%d\t%d\t%d\t\n",
sparseArray[i][0],
sparseArray[i][1],
sparseArray[i][2]);
}
return sparseArray ;
}

4)、方法三:转为二维数组

public static void convertSparseArray (int sparseArray[][]){
// 读取稀疏数组首行创建二维数组==>> int chessArray[][] = new int[11][11];
int chessArray[][] = new int[sparseArray[0][0]][sparseArray[0][1]] ;
// 非零元素赋值给二维数组
for(int i = 1; i < sparseArray.length; i++) {
// 几行、几列、是什么值
chessArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
// 打印二维数组
for (int[] row : chessArray) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
}

5)、主程序调用

public static void main(String[] args) {
// 棋盘:基于二维数组
int chessArray[][] = printChess () ;
System.out.println("==========================");
// 二维数组转稀疏数组
int sparseArray[][] = convertTwoArray(chessArray) ;
System.out.println("==========================");
// 稀疏数组转二维数组
convertSparseArray(sparseArray);
}

三、源代码地址

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

JAVA描述算法和数据结构(01):稀疏数组和二维数组转换的更多相关文章

  1. Java知识系统回顾整理01基础06数组06二维数组

    一.一维数组和二维数组 这是一个一维数组, 里面的每一个元素,都是一个基本类型int int a[] =new int[]{1,2,3,4,5}; 这是一个二维数组,里面的每一个元素,都是一个一维数组 ...

  2. java - day005 - 数组工具类, 数组复制,二维数组,变量,方法, 面向对象

    1. java.util.Arrays  数组工具类    Arrays.toString (数组) 数组值链接字符串 Arrays.sort(数组) 基本类型: 优化的快速排序 引用类型: 优化的合 ...

  3. java基础5 (一维)数组和二维数组

    本文知识点(目录): 一维数组(一维数组的概念.优点.格式.定义.初始化.遍历.常见异常.内存分析以及常见操作(找最大值.选择排序.冒泡排序等等))    二维数组(二维数组的遍历.排序.查找.定义. ...

  4. Java数组之二维数组

    Java中除了一维数组外,还有二维数组,三维数组等多维数组.本文以介绍二维数组来了解多维数组. 1.二维数组的基础 二维数组的定义:二维数组就是数组的数组,数组里的元素也是数组. 二维数组表示行列二维 ...

  5. Java编程基础——数组和二维数组

    Java编程基础——数组和二维数组 摘要:本文主要对数组和二维数组进行简要介绍. 数组 定义 数组可以理解成保存一组数的容器,而变量可以理解为保存一个数的容器. 数组是一种引用类型,用于保存一组相同类 ...

  6. 一维数组、二维数组——Java

    一. 一维数组 1.  数组是相同类型数据的有序集合 相同类型的若干个数据,按照一定先后次序排列组合而成 每个数组元素可以通过一个下标来访问它们 其中,每一个数据称作一个数组元素 2. 数组特点: 其 ...

  7. 第二篇 javascript一维数组和二维数组及方法

    一.数组 什么是数组 程序=数据+算法 数组就是一种很常见的保存批量数据的数据结构 一.定义数组 var arr1=[]; //定义了一个不包含元素的数组 ,,]; //定义了一个包含三个元素的数组 ...

  8. C# 数组、一维数组、二维数组、多维数组、锯齿数组

    C#  数组.一维数组.二维数组.多维数组.锯齿数组 一.数组: 如果需要使用同一类型的对象,就可以使用数组,数组是一种数据结构,它可以包含同一类型的多个元素.它的长度是固定的,如长度未知的情况下,请 ...

  9. android JNI 一维数组、二维数组的访问与使用

    在JNI中访问JAVA类中的整型.浮点型.字符型的数据比较简单,举一个简单的例子,如下: //得到类名 jclass cls = (*env)->GetObjectClass(env, obj) ...

随机推荐

  1. GitHub 上的 12306 抢票神器,助力回家过年

    又到周末了,不过本周末有些略微的特殊. 距离每年一次的全球最大规模的人类大迁徙活动已经只剩下一个多月了,各位在外工作一年的小伙伴大多数人又要和小编一样摩拳擦掌的对待史上最难抢的抢票活动. 然鹅,身为一 ...

  2. Nginx-HTTP Strict Transport Security(HSTS)

    HTTP Strict Transport Security(HSTS) HTTP Strict Transport Security(通常简称为HSTS)是一个安全功能,它告诉浏览器只能通过HTTP ...

  3. [ASP.NET Core 3框架揭秘] 依赖注入[3]:依赖注入模式

    IoC主要体现了这样一种设计思想:通过将一组通用流程的控制权从应用转移到框架之中以实现对流程的复用,并按照"好莱坞法则"实现应用程序的代码与框架之间的交互.我们可以采用若干设计模式 ...

  4. SpringBoot内容聚合

    分类整理一些内容,方便需要时回过头来看,整理不易,如有疏漏,请多担待!之后要查看这篇文章,公众号后台回复 “Springboot聚合” SpringBoot+Mybatis多模块(module)项目搭 ...

  5. 在CentOS 7 上使用Docker 运行.NetCore项目

    安装Docker CentOS 7 安装 Docker 编写Dockerfile 右键项目->添加->Docker 支持 选择Linux 修改为如下: FROM mcr.microsoft ...

  6. ProcessExplorer 工具下载

    链接:https://pan.baidu.com/s/1RPYkFqIMvBX2OKvTm0bgkw 提取码:4v5v

  7. python数据挖掘第三篇-垃圾短信文本分类

    数据挖掘第三篇-文本分类 文本分类总体上包括8个步骤.数据探索分析->数据抽取->文本预处理->分词->去除停用词->文本向量化表示->分类器->模型评估.重 ...

  8. 常见SQL编写和优化

    常见的SQL优化方式 对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by 涉及的列上建立索引. 应尽量避免在 where 子句中对字段进行null 值判断,否则将导致引擎放弃 ...

  9. Linux是如何启动的?

    参考资料: An introduction to the Linux boot and startup processes 这篇随笔,可以理解为是对这篇英文文章的翻译与个人理解.笔记的整合. 扩展阅读 ...

  10. TCP 连接与 HTTP 请求的相关问题

    1.现代浏览器在与服务器建立了一个 TCP 连接后是否会在一个 HTTP 请求完成后断开?什么情况下会断开? 默认情况下建立 TCP 连接不会断开,只有在请求报头中声明 Connection: clo ...