数据结构和算法-稀疏数组转原始数组|学习笔记

简介: 快速学习数据结构和算法-稀疏数组转原始数组

开发者学堂课程【Go 语言核心编程 - 数据结构和算法:数据结构和算法-稀疏数组转原始数组】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/627/detail/9830


数据结构和算法-稀疏数组转原始数组

 

内容简介:

一、思路分析

二、代码实现

 

一、思路分析

恢复的时候直接去遍历文件,这个文件遍历一行就往里面扔一行,遍历一行就写一行,那么这个时候,因为没有去存盘,所以这简单的就直接从稀疏数组把它返回回来,待会要代码实现的时候,下图可供参考,

如下:

 image.png

 

二、代码实现

(1)稀疏数组转原始数组代码实现及运行结果

先找到之前写代码的位置,即打开 chapter20/sparsearray/main.go文件,接着在最后一行中输入代码,如下:

//将这个稀疏数组,存盘 d:/chessmap.data

//如何恢复原始数组

//1.打开这个 d:/chessmap.data => 恢复原始数组

//2.这里使用稀疏数组恢复

//先创建一个原始数组(这个数组规模大小怎么去做?标准的写法应该先读出它的数据,然后根据其两个数据,也就是根据存进去的这个11和那个11来决定原始数组的行和列,但是刚才已经讲过了,在 Go 语言中,在创业的时候,必须直接指定这个具体的数字,所以可以先做个切片,用切片来恢复就行了,这里就直接就写到这里)

var chessMap2 [11][11]int

//遍历 sparseArr[遍历文件每一行]

for _, valNode := range sparseArr {

chessMap2[valNode.row][valNode.col] = valNode.val

}

//看看 chessMap2 是不是恢复

fmt.Println(恢复后的原始数组......)

for _, v := range chessMap2

for _, v2 := range v {

fmt.Printf(%d\t, v2)

}

fmt.Println()

}

}

代码运行结果为:

image.png

(2)对以上代码运行结果的分析及改进

运行结果显示有问题,它说chessMap2[valNode.row][valNode.col] = valNode.val“有问题,这边有一个数组越界那么为什么出了问题?

是因为原先的数组里面,它记录11110这个其实目前没什么用处,这种情况来说没用,得跳过这个因为它是代表的你有几行几列的原始数据,将来的价值在什么地方?

别人如果问到,面试官问到你第一行的十一十一零是什么这个十一十一是用来确定将来二数组开多大这才有用,但是在 Golang 中,对二维数组来说,这两个数据它跳过去就行了,怎么跳?

非常简单,将以上部分的代码修改为以下代码:

//遍历 sparseArr [遍历文件每一行]

for i, valNode := range sparseArr {

if i != 0 {  

//跳过第一行记录值

chessMap2[valNode.row][valNode.col] = valNode.val

}

}

再来运行一遍以上代码,执行结果为

如下:

image.png

可以上图中,看到中间过渡是很清晰的,一个是原始的数组,一个是稀疏的数组,最后恢复过后,又变成了数字,当然具体的情况还要具体分析

(3)小结

如果想去用一个切片来做,也可以,可以把它改成一个切片去尝试做一做这里面的关键点不是讲是不是切片的问题关键点是在讲解一种思想数据结构它其实是一种算法的一个底层,它讲的是一种思想,就是告诉大家以后遇到一种类似有大量的重重复数据的问题,怎么去解决的思路.

(4)作业

关于稀疏数组的概念,

有以下两点要求:

①将构建的稀疏数组存盘 chessmap.data 。

在恢复原始二维数组,要求此文件 chessmap.data 读取。


相关文章
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
86 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
2月前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
33 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
2月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
35 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
2月前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
38 4
|
2月前
|
搜索推荐 算法
数据结构与算法学习十四:常用排序算法总结和对比
关于常用排序算法的总结和对比,包括稳定性、内排序、外排序、时间复杂度和空间复杂度等术语的解释。
22 0
数据结构与算法学习十四:常用排序算法总结和对比
|
2月前
|
机器学习/深度学习 搜索推荐 算法
探索数据结构:初入算法之经典排序算法
探索数据结构:初入算法之经典排序算法
|
2月前
|
算法 Java 索引
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
25 0
|
2月前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
3天前
|
算法
基于GA遗传算法的PID控制器参数优化matlab建模与仿真
本项目基于遗传算法(GA)优化PID控制器参数,通过空间状态方程构建控制对象,自定义GA的选择、交叉、变异过程,以提高PID控制性能。与使用通用GA工具箱相比,此方法更灵活、针对性强。MATLAB2022A环境下测试,展示了GA优化前后PID控制效果的显著差异。核心代码实现了遗传算法的迭代优化过程,最终通过适应度函数评估并选择了最优PID参数,显著提升了系统响应速度和稳定性。
|
3天前
|
算法
基于大爆炸优化算法的PID控制器参数寻优matlab仿真
本研究基于大爆炸优化算法对PID控制器参数进行寻优,并通过Matlab仿真对比优化前后PID控制效果。使用MATLAB2022a实现核心程序,展示了算法迭代过程及最优PID参数的求解。大爆炸优化算法通过模拟宇宙大爆炸和大收缩过程,在搜索空间中迭代寻找全局最优解,特别适用于PID参数优化,提升控制系统性能。