开发者学堂课程【Go 语言核心编程 - 数据结构和算法:数据结构和算法-稀疏数组转原始数组】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/627/detail/9830
数据结构和算法-稀疏数组转原始数组
内容简介:
一、思路分析
二、代码实现
一、思路分析
恢复的时候直接去遍历文件,这个文件遍历一行就往里面扔一行,遍历一行就写一行,那么这个时候,因为没有去存盘,所以这简单的就直接从稀疏数组把它返回回来,待会要代码实现的时候,下图可供参考,
如下:
二、代码实现
(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()
}
}
代码运行结果为:
(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
}
}
再来运行一遍以上代码,执行结果为
如下:
可以上图中,看到中间过渡是很清晰的,一个是原始的数组,一个是稀疏的数组,最后恢复过后,它又变成了数字,当然具体的情况还要具体分析。
(3)小结
如果想去用一个切片来做,也可以,可以把它改成一个切片去尝试做一做,这里面的关键点不是讲它是不是切片的问题,关键点是在讲解一种思想数据结构,它其实是一种算法的一个底层,它讲的是一种思想,就是告诉大家以后遇到一种类似有大量的重重复数据的问题,怎么去解决的思路.
(4)作业
关于稀疏数组的概念,
有以下两点要求:
①将构建的稀疏数组存盘 chessmap.data 。
②在恢复原始二维数组,要求此文件 chessmap.data 读取。