什么是稀疏数组
如果一个数组(包括多维数组)中的大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组,节约空间。
一般来说,稀疏数组的处理方法是:
1.记录数组一共有几行几列,有多少个不同的数值。
2.把具有不同值的元素的行列及记录在一个小规模的数组中,从而缩小程序的规模。
下面是代码实现
package main
import "fmt"
//定义存储数据的结构体
type valNode struct {
row int //表示二维数组的行
clo int //表示二维数组的列
val int //表示二维数组的值
}
func main() {
//定义一个二维数组表示棋盘
var valMaps [11][11]int
valMaps[1][2] = 1 //表示第二行(因为下标从零开始)第三列有颗黑色棋子
valMaps[2][3] = 2 //表示第三行第四列有颗白色棋子
//遍历数组表示棋盘
for _,v := range valMaps{
for _,v2 := range v{
fmt.Printf("%d",v2)
}
fmt.Println()
}
//转换为稀疏数组
var valNodes []valNode
//稀疏数组的第一位我们固定放入二维数组的行和列的固定值
valNodes = append(valNodes, valNode{
row: 11,
clo: 11,
val: 0,
})
for i,v := range valMaps{
for j,v2 := range v{
//当数组中有不为0的元素,我们记录行和列放入稀疏数组
if v2 != 0{
valNodes = append(valNodes, valNode{
row: i,
clo: j,
val: v2,
})
}
}
}
//打印稀疏数组
fmt.Println(valNodes)
//恢复数据到新的数组中
var newValMaps [11][11]int
for i,v := range valNodes{
//排除二维数组的第一位
if i != 0{
//将数据恢复到新的数组中
newValMaps[v.row][v.clo] = v.val
}
}
//打印新的数组
for _,v := range newValMaps{
for _,v2 := range v{
fmt.Printf("%d",v2)
}
fmt.Println()
}
}
下面是代码的执行结果
GOROOT=C:\Go #gosetup
GOPATH=E:\gopath #gosetup
C:\Go\bin\go.exe build -o C:\Users\v_licguo\AppData\Local\Temp\___go_build_dataStructure.exe dataStructure #gosetup
C:\Users\v_licguo\AppData\Local\Temp\___go_build_dataStructure.exe #gosetup
00000000000
00100000000
00020000000
00000000000
00000000000
00000000000
00000000000
00000000000
00000000000
00000000000
00000000000
[{11 11 0} {1 2 1} {2 3 2}]
00000000000
00100000000
00020000000
00000000000
00000000000
00000000000
00000000000
00000000000
00000000000
00000000000
00000000000