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]