当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组
如下图,在一个二维数组中大部分是同一个数,这样的情况就可以使用稀疏数组来保存数据
实现一个稀疏数组
package main
import (
"fmt"
)
type ValNode struct {
row int
col int
val int
}
func main() {
//1. 先创建一个原始数组
var chessMap [11][11]int
chessMap[1][2] = 1 //黑子
chessMap[2][3] = 2 //蓝子
//2. 输出看看原始的数组
for _, v := range chessMap { for _, v2 := range v {
fmt.Printf("%d\t", v2)
}
fmt.Println()
}
//3. 转成稀疏数组
//(1). 遍历 chessMap, 如果我们发现有一个元素的值不为 0,创建一个 node 结构体
//(2). 将其放入到对应的切片即可
var sparseArr []ValNode
//标准的一个稀疏数组应该还有一个 记录元素的二维数组的规模(行和列,默认值)
//创建一个 ValNode 值,记录行数,列数。默认值
valNode := ValNode{
row : 11,
col : 11,
val : 0,
}
//将行数,列数,默认值加入到数组中
sparseArr = append(sparseArr, valNode)
for i, v := range chessMap {
for j, v2 := range v {
if v2 != 0 {
//创建一个 ValNode 值结点
valNode := ValNode{
row : i,
col : j,
val : v2,
}
sparseArr = append(sparseArr, valNode)
}
}
}
//4. 输出稀疏数组
fmt.Println("\n当前的稀疏数组是:::::")
for _, valNode := range sparseArr {
fmt.Printf("%d %d %d\n", valNode.row, valNode.col, valNode.val)
}
// 先创建一个原始数组
var chessMap2 [11][11]int
// 遍历 sparseArr [遍历文件每一行]
for i, valNode := range sparseArr {
if i != 0 {
//跳过第一行记录值
chessMap2[valNode.row][valNode.col] = valNode.val
}
}
//看看chessMap2是不是恢复 .
fmt.Println("恢复后的原始数据 ")
for _, v := range chessMap2 {
for _, v2 := range v {
fmt.Printf("%d\t", v2)
}
fmt.Println()
}
}
执行的输出为
>go run main.go
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
当前的稀疏数组是:::::
11 11 0
1 2 1
2 3 2
恢复后的原始数据
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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。