Go语言中的稀疏数组
稀疏数组(Sparse Array)是一种高效存储大量空白数据的数组结构。它在需要存储大量默认值(通常是0或空值)的情况下非常有用,因为它只存储非默认值的元素及其位置信息,从而大大减少内存使用。
概念
稀疏数组的核心思想是只记录以下信息:
- 原始数组的行数和列数
- 非默认值的元素数量
- 每个非默认值的行索引、列索引和值
Go实现示例
下面是一个完整的Go稀疏数组实现示例:
package main
import "fmt"
// ValNode 定义一个三元组结构体,存储稀疏数组的非零值
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. 输出原始数组
fmt.Println("原始数组:")
for _, row := range chessMap {
for _, val := range row {
fmt.Printf("%d ", val)
}
fmt.Println()
}
// 3. 转为稀疏数组
var sparseArr []ValNode
// 首先记录数组的维度(11行11列)和非零值数量
defaultVal := 0
nonZeroCount := 0
for i, row := range chessMap {
for j, val := range row {
if val != defaultVal {
nonZeroCount++
node := ValNode{
Row: i,
Col: j,
Val: val,
}
sparseArr = append(sparseArr, node)
}
}
}
// 头部存储数组信息(行、列、默认值)
header := ValNode{
Row: len(chessMap),
Col: len(chessMap[0]),
Val: defaultVal,
}
sparseArr = append([]ValNode{header}, sparseArr...)
// 4. 输出稀疏数组
fmt.Println("\n稀疏数组:")
for i, node := range sparseArr {
if i == 0 {
fmt.Printf("头部: %d 行 %d 列 默认值=%d\n", node.Row, node.Col, node.Val)
} else {
fmt.Printf("%d: %d %d %d\n", i, node.Row, node.Col, node.Val)
}
}
// 5. 将稀疏数组恢复为原始数组
var newChessMap [11][11]int
for i, node := range sparseArr {
if i == 0 { // 跳过头部信息
continue
}
newChessMap[node.Row][node.Col] = node.Val
}
// 6. 输出恢复后的数组
fmt.Println("\n恢复后的数组:")
for _, row := range newChessMap {
for _, val := range row {
fmt.Printf("%d ", val)
}
fmt.Println()
}
}
输出示例
运行上述代码会得到类似以下输出:
原始数组:
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: 1 2 1
2: 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
应用场景
稀疏数组常用于:
- 棋盘类游戏的数据存储(如五子棋)
- 图像处理(存储大量空白像素的图像)
- 大规模矩阵计算(很多元素为0的矩阵)
- 数据库索引存储
这种数据结构在存储空间昂贵或数据传输受限的场景下特别有用。
作者:陈敬(公众号:敬YES)
出处:http://www.cnblogs.com/janes/
博客文章仅供交流学习,请勿用于商业用途。如需转载,请务必注明出处。
浙公网安备 33010602011771号