什麼是稀疏數組
如果一個數組(包括多維數組)中的大部分元素爲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