golang稀疏数组
1.使用原因
在写程序的存储使用数组时原数组中会存在大量的无效数据,占据了大量的存储空间,对服务器的读取和储存造成负担,因此我们可以使用稀疏数组进行优化。
2.使用原理
二维数组:0 0 0 0 0 0 ————》 稀疏数组:row col val
0 0 0 1 0 0 6 6 0 几行几列
0 2 0 2 0 0 1 3 1 val 所在位置
0 0 0 3 0 0 2 1 2
0 0 0 0 0 0 2 3 2
0 0 0 0 0 0 3 2 3
3.使用方法
package main
import (
"fmt"
)
type ValNode struct {
row int
col int
val int
}
func main() {
//创建上图原始数组
var chessMap [6][6]int
chessMap[1][3] = 1
chessMap[2][1] = 2
chessMap[2][3] = 2
chessMap[3][2] = 3
for _, v := range chessMap {
for _, v2 := range v {
fmt.Printf("%d\t", v2)
}
fmt.Println()
}
//转化为稀疏数组
//思路:
//1遍历chessmao,如果发现有一个元素的值不为0,创建一个node结构体
//2将起放入对应的切片
var sparseArr []ValNode
valNode := ValNode{ //记录数组的规模
row : 6,
col : 6,
val : 0,
}
sparseArr = append(sparseArr, valNode)
for i, v := range chessMap {
for j, v2 := range v {
if v2 != 0 {
valNode := ValNode{
row : i,
col : j,
val : v2,
}
sparseArr = append(sparseArr, valNode)
}
}
}
//输出稀疏数组
fmt.Println("当前的稀疏数组是:")
for i, valNode := range sparseArr{
fmt.Printf("%d: %d %d %d\n", i, valNode.row, valNode.col, valNode.val)
}
var chessMap2[6][6]int
for i, valNode := range sparseArr{ //遍历sparesArr 文件每一行
if i != 0 { // 跳过一行数据,此为数组大小
chessMap2[valNode.row][valNode.col] = valNode.val
}
}
fmt.Println("恢复的数据")
for _, v := range chessMap2 {
for _, v2 := range v {
fmt.Printf("%d\t", v2)
}
fmt.Println()
}
}