Go数据结构之稀疏数组
一:稀疏数组的应用场景

当一个数组中大部分元素为0,或者为同一个值得数组时,可以使用稀疏数组来保存该数组。
①:记录数组一共有几行几列,有多少个不同的值;
②:把不同的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
③:上图可稀疏数组可变成
row col value
11 11 0
1 2 1
2 3 2
由上图可知,稀疏数组可大大减少资源的耗费,其中11 11 0代表有多少行多少列
二:使用举例
①:
package main
import (
"fmt"
)
type ValNode struct{
row int
col int
val int
}
func main(){
//原始数组
var chessMap [11][11]int
chessMap[1][2] = 1
chessMap[2][3] = 2
//打印原始数据
for i1, v1 := range chessMap {
for i2, v2 := range v1 {
fmt.Printf("%d*%d=%d\t", i1, i2, v2)
}
fmt.Println()
}
//初始化稀疏数组
var sparseArr []ValNode
valNode := ValNode{
row : len(chessMap),
col : len(chessMap[0]),
val : 0,
}
sparseArr = append(sparseArr ,valNode)
for i1, v1 := range chessMap {
for i2, v2 := range v1 {
if v2 != 0 {
valNode := ValNode{
row : i1,
col : i2,
val : v2,
}
sparseArr = append(sparseArr ,valNode)
}
}
}
fmt.Println(sparseArr)
}
结果
[ `go run sparseArray.go` | done ]
0*0=0 0*1=0 0*2=0 0*3=0 0*4=0 0*5=0 0*6=0 0*7=0 0*8=0 0*9=0 0*10=0
1*0=0 1*1=0 1*2=1 1*3=0 1*4=0 1*5=0 1*6=0 1*7=0 1*8=0 1*9=0 1*10=0
2*0=0 2*1=0 2*2=0 2*3=2 2*4=0 2*5=0 2*6=0 2*7=0 2*8=0 2*9=0 2*10=0
3*0=0 3*1=0 3*2=0 3*3=0 3*4=0 3*5=0 3*6=0 3*7=0 3*8=0 3*9=0 3*10=0
4*0=0 4*1=0 4*2=0 4*3=0 4*4=0 4*5=0 4*6=0 4*7=0 4*8=0 4*9=0 4*10=0
5*0=0 5*1=0 5*2=0 5*3=0 5*4=0 5*5=0 5*6=0 5*7=0 5*8=0 5*9=0 5*10=0
6*0=0 6*1=0 6*2=0 6*3=0 6*4=0 6*5=0 6*6=0 6*7=0 6*8=0 6*9=0 6*10=0
7*0=0 7*1=0 7*2=0 7*3=0 7*4=0 7*5=0 7*6=0 7*7=0 7*8=0 7*9=0 7*10=0
8*0=0 8*1=0 8*2=0 8*3=0 8*4=0 8*5=0 8*6=0 8*7=0 8*8=0 8*9=0 8*10=0
9*0=0 9*1=0 9*2=0 9*3=0 9*4=0 9*5=0 9*6=0 9*7=0 9*8=0 9*9=0 9*10=0
10*0=0 10*1=0 10*2=0 10*3=0 10*4=0 10*5=0 10*6=0 10*7=0 10*8=0 10*9=0 10*10=0
[{11 11 0} {1 2 1} {2 3 2}]
②:在上面的基础上稀疏数组变回原来的二维数组
package main
import (
"fmt"
)
type ValNode struct{
row int
col int
val int
}
func main(){
//原始数组
var chessMap [11][11]int
chessMap[1][2] = 1
chessMap[2][3] = 2
//打印原始数据
// for i1, v1 := range chessMap {
// for i2, v2 := range v1 {
// fmt.Printf("%d*%d=%d\t", i1, i2, v2)
// }
// fmt.Println()
// }
//初始化稀疏数组
var sparseArr []ValNode
//约定第一行是记录原数组大小
valNode := ValNode{
row : len(chessMap),
col : len(chessMap[0]),
val : 0,
}
sparseArr = append(sparseArr ,valNode)
for i1, v1 := range chessMap {
for i2, v2 := range v1 {
if v2 != 0 {
valNode := ValNode{
row : i1,
col : i2,
val : v2,
}
sparseArr = append(sparseArr ,valNode)
}
}
}
// fmt.Println(sparseArr[0].col)
//go不可以使用可变参数赋值var NewChessMap [sparseArr[0].row][sparseArr[0].col]int
var NewChessMap [11][11]int
for i, v := range sparseArr {
if i == 0 {
continue
}
NewChessMap[v.row][v.col] = v.val
}
//遍历还原新数组
for _, v := range NewChessMap{
fmt.Println(v)
}
}
结果
[ `go run sparseArray.go` | done ]
[0 0 0 0 0 0 0 0 0 0 0]
[0 0 1 0 0 0 0 0 0 0 0]
[0 0 0 2 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0]

浙公网安备 33010602011771号