稀疏数组
前言
- 使用语言 go
- 学习笔记库使用+
- 有地方需要填坑
思路
- 普通数组 压缩精简
- 将单个有效元素相关数据放入结构体
- 结构体作为元素存入数组切片,
- 实现文件对数组切片的读写
- 个人认为关键点:有效数据 转为 结构体 、 数组切片
1.概念
是普通数组的压缩,此处数组有大量重复一样的数据(或者无效的数据)
普通数组
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 2 0
数组分析:以上数组分析:总行数4 总列数5 有效数据2
转为稀疏数组,这样有效数据就又转为新的数组
行 列 值 (普通数组中代表的含义)
4 5 2
1 2 1
3 3 2
2.优势
- 原数组中存在大量的无效数据,占据了大量的存储空间,真正有用的数据却少之又少
- 压缩存储可以节省存储空间以避免资源的不必要的浪费,在数据序列化到磁盘时,压缩存储可以提高IO效率
3.整体思考
-
普通数组转化为稀疏数组以后,得到一个新的数组,
-
每行数据含有的信息是(普通数组的 行、列、值 ),也就是说每一行就是一组关于有效数据的定位信息,(但是不要被这个新的数组干扰,新数组只是为了方便观看分析)
-
现在要考虑如何将这些数据写入文件,简单思考,两个for 循环就可以了,但是当你储存以后,在展开的时候,在使用for 循环还原成普通数组,期间的逻辑将会是一个很麻烦的事情
当然可以使用限制 列 的值,实现行的跳转,来进行二维数组的还原,但是为什么不用呢?
(我也不知道,暂时定义成寻找另外的方法吧 。。。)
-
每一行是一组数据,每组数据都有三个信息,这么多的数据可以考虑结构体,这样利用结构体可以精确达到对每个信息的访问。这样每一行就是一个结构体,稀疏数组就变成了一个 元素为结构体的一维数组,一维数组在进行磁盘的读写就方便多了
(好吧,我也扯不下去了,底层的原因,应该是数组可以进行地址访问,更快吧,等补完了数据结构在填坑吧)
4.代码
普通数组 > 建立个普通数组 > 打印出来验证是否正确建立 > 转为稀疏数组 > 每个有效数据存入一个结构体 > 结构体作为元素放入数组
package main
import(
"fmt"
)
func main(){
//定义一个的数组,并初始化,打印出来查看是否初始化成功
var chessMap [4][5]int //初始默认值全为0
chessMap[1][2] = 1
chessMap[3][3] = 2
for i , v = range chessMap{
for j , v2 = range v{
fmt.Print(v2)
}
}
//普通数组简化成稀疏数组,每一行中的数据是有效数据的定位信息(行,列,具体数据)
//遍历普通数组,将非零项遍历出来,然后把他的信息储存在结构体中
//将结构体再作为数据存入数组切片中,能够动态增加元素
//定义一个结构体
var valNode struct{
row int
col int
value int
}
//定义一个数组切片用来动态追加结构体元素
var sparseArry []valNode
//结构体、数组 初始化
valNode := valNode{
row = 4,
col = 5,
value = 2
}
//通过索引位置可以区别不同的valNode
sparseArry := append(sparseArry,valNode)
//遍历普通数组找到非零项
for i , v := range chessMap{ //注意这个 v 仍旧是一个一维数组,普通数组每一行的数组
for j , v2 := range v{ //这个地方才真正遍历出来了每个元素
if v2 != 0{
valNode := valNode{
row = i
col = j
value = v2
}
sparseArry := append(sparseArry , valNode) //结构体追加入切片数组
}
}
}
//写入磁盘文件
以后补
//从磁盘文件写出
以后补
//将稀疏数组恢复成普通数组中,注意把第一行的普通数组信息去除掉
//对于很多数据的,可以考虑一个,其他的都用 for 循环遍历实现
var newChessMap [4][5]int
for i ,value := range sparseArry{ //遍历每个数组元素(结构体)赋值给value
if i != 0{
newChessMap[value.row][value.col] := value.value
}
}
//将新的数组打印出来,验证是否正确
for i , v:= range newChessMap{
for j , v2 := range v{
fmt.Print(v2)
}
}
}
5.总结
- 该块代码设计 切片数组、结构体的创建声明、赋值、追加元素
- 要深刻理解多维数组每一维度的数据关系每一行是一个数组,所以遍历的时候,最外层先遍历出来的是一个数组(二维数组为例)
- 数据写入/写出磁盘操作
6.参考
- https://blog.youkuaiyun.com/weixin_41922289/article/details/94555391