本文源码: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. python之MiniWeb框架

    以往,我们多完成的是静态web服务器,主要处理的都是一些已经‘写死’的数据,那么今天,我们来学习一下动态数据的处理. 说到动态数据,我们就需要了解一个东西,那就是web框架. 所谓web框架简单地说就 ...

  2. C# 中的 bool、char 和 string 类型

    上一篇(地址:https://www.vinanysoft.com/c-sharp-basics/data-types/fundamental-numeric-types/)只介绍了基本数值类型,本篇 ...

  3. Linux-3.14.12内存管理笔记【伙伴管理算法(4)】

    此处承接前面未深入分析的页面释放部分,主要详细分析伙伴管理算法中页面释放的实现.页面释放的函数入口是__free_page(),其实则是一个宏定义. 具体实现: [file:/include/linu ...

  4. Autofac 泛型依赖注入

    using Autofac;using Autofac.Extensions.DependencyInjection;using Hangfire;using Microsoft.AspNetCore ...

  5. Information Management System

    Information Management System 一.代码部分 #include <stdio.h> #include <stdlib.h> #include < ...

  6. Jmeter+Ant+Jenkins集成抛出异常java.lang.ClassNotFoundException: javax.mail.internet.MimeMessage

    一.问题描述 二.解决方法 下载javax.mail.jar插件,并将该插件放到%ANT_HOME%\lib目录下即可解决,下载地址:https://javaee.github.io/javamail ...

  7. 东芝半导体最新ARM开发板——TT_M3HQ开箱评测

    前言 最近从面包板社区申请到一块东芝最新ARM Cortex-M3内核的开发板--TT_M3HQ,其实开发板收到好几天了,这几天一直在构思怎么来写这第一篇评测文章,看大家在社区也都发了第一篇评测,我也 ...

  8. 系统 (一) Windows10安装Ubuntu子系统

    前言 本文将基于 Windows10专业版 安装 Ubuntu子系统 1.控制面板 -> 程序 -> 选择启用或关闭Windows功能 -> 勾上 适用Linux的Windwos子系 ...

  9. NET Framework项目移植到NET Core上遇到的一系列坑

    原文:NET Framework项目移植到NET Core上遇到的一系列坑 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https: ...

  10. 阿里iconfont的使用

    1.找到阿里巴巴图标库 2.找到图标 3.搜索你想要的图标 4.将图标添加到购物车 5.点击右上角的购物车按钮,我这里添加了两个. 6.提示你登陆,不需要花钱,找其中一个账号登陆一下就行了 假如你使用 ...