一、基本简介

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("%dt", 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("%dt%dt%dtn",

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("%dt", 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

码云地址:知了一笑

https://gitee.com/cicadasmile/model-arithmetic-parent

java 二维数据结构_JAVA描述算法和数据结构(01):稀疏数组和二维数组转换相关推荐

  1. JAVA描述算法和数据结构(01):稀疏数组和二维数组转换

    一.基本简介 1.基础概念 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵:与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵.定义非零元 ...

  2. python数据结构推荐书-「算法与数据结构」从入门到进阶吐血整理推荐书单

    推荐一下「算法与数据结构」从入门到进阶的书单. 一.入门系列 这些书籍通过图片.打比方等通俗易懂的方法来讲述,让你能达到懂一些基础算法,线性表,堆栈,队列,树,图,DP算法,背包问题等,不要求会实现, ...

  3. java按成绩排序_JAVA中按分数高低对同学进行排序二维数组

    文字太多发不上来,我发图片吧 这是运行结果,你核对下: 先上部分代码public static void main(String[] args) { String[] Names = {"张 ...

  4. java 网游加速器源码_Java/C++算法与数据结构系列视频教程【源码+课件打包】

    课程目录 第一章:当我们在讨论算法的时候,我们在讨论什么? 1-1 我们究竟为什么要学习算法 1-2 课程介绍 第二章:排序基础 2-1 选择排序法 2-2 使用模板(泛型)编写算法 2-3 随机生成 ...

  5. java经典50题_JAVA经典算法50题(3)【面试+工作】

    原标题:JAVA经典算法50题(3)[面试+工作] JAVA经典算法50题(3)[面试+工作] [程序21] 题目:求1+2!+3!+...+20!的和. 1.程序分析:此程序只是把累加变成了累乘. ...

  6. java求公式例题_JAVA经典算法40题

    1: JAVA经典算法40题 2: [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 3 ...

  7. java g1 详解_JAVA垃圾收集算法总结以及CMS、G1算法详解

    前段时间由于工作原因一直很忙,上周项目验收后时间终于空闲下来,博客也有好几个月没有更新了,趁着还有几天放假,借这个机会写点东西:网上也有很多人写过Java垃圾收集器,特别现在主流比较火的CMS和G1算 ...

  8. Java排序算快速排序_Java排序算法 [快速排序]

    package cn.com.dom4j.sort; public class QuickSort { /** 快速排序 在 Java中, 快速排序被用作基本数据类型的排序 (当然, 不只快速排序一种 ...

  9. java选择排序代码_Java排序算法总结之选择排序

    本文实例讲述了Java排序算法总结之选择排序.分享给大家供大家参考.具体分析如下: 选择排序的基本操作就是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部 ...

最新文章

  1. 第十六课.基于K-means的图像分割
  2. php serialize unserialize 数据序列化 与 反序列化
  3. 使用QEMU创建虚拟机
  4. Unity-3d Day03
  5. vc6.0出现无法解析错误
  6. hive 百分比_HIVE短期内再次突破前高
  7. c linux time微秒_Python时间处理模块:time模块、datetime模块及日历模块Calendar
  8. C++Vector使用方法
  9. 同步方法 调用异步防范_Spring一个注解实现方法的异步调用,再也不用单开线程了...
  10. 基于uFUN开发板的心率计(三)Qt上位机的实现
  11. Oracle ——数据库 SQL 分页性能分析
  12. netapp学习(三)---assign unowned disk
  13. 全国计算机一级考试难度高吗,计算机等级考试分几级 考试难度大不大
  14. 关于MFC窗口句柄,窗口ID,窗口指针
  15. paraview打开黑屏_ParaView使用指南---ParaView-1.4-使用指南.pdf
  16. 执行DBMS_SQLTUNE优化sql或dbms_stats收集统计信息报错:ORA-20003
  17. 用户使用调查报告(追光的人)
  18. Ubuntu16.04安装NCCL
  19. 咳咳,建模大神教你如何用ZBrush雕刻肌肉上课时间到了
  20. php array assoc,PHP array_uintersect_assoc() 函数

热门文章

  1. laravel 创建自定义的artisan make命令来新建类文件
  2. python字典和JSON格式的转换
  3. 洛谷试炼场-简单数学问题-二分查找
  4. Android Studio 第六十三期 - Android框架 -RecycleView所有用法
  5. mysql存储过程 --游标的使用 取每行记录 (多字段)
  6. linux下chkConfig的用法,mysqld开机自启动
  7. C# 对话框隐藏 标题栏
  8. I.MX6 查看baudrate确定是否被其他程序占用
  9. 虚拟机网卡无法启动获取ip地址
  10. HiddenField控件[转载]