找回密码
 立即注册
首页 业界区 安全 Go稀疏数组实现与示例

Go稀疏数组实现与示例

伯斌 2025-10-21 16:20:10
Go语言中的稀疏数组

稀疏数组(Sparse Array)是一种高效存储大量空白数据的数组结构。它在需要存储大量默认值(通常是0或空值)的情况下非常有用,因为它只存储非默认值的元素及其位置信息,从而大大减少内存使用。
概念

稀疏数组的核心思想是只记录以下信息:

  • 原始数组的行数和列数
  • 非默认值的元素数量
  • 每个非默认值的行索引、列索引和值
Go实现示例

下面是一个完整的Go稀疏数组实现示例:
  1. package main
  2. import "fmt"
  3. // ValNode 定义一个三元组结构体,存储稀疏数组的非零值
  4. type ValNode struct {
  5.         Row int // 行
  6.         Col int // 列
  7.         Val int // 值
  8. }
  9. func main() {
  10.         // 1. 先创建一个原始数组
  11.         var chessMap [11][11]int
  12.         chessMap[1][2] = 1 // 黑子
  13.         chessMap[2][3] = 2 // 蓝子
  14.         // 2. 输出原始数组
  15.         fmt.Println("原始数组:")
  16.         for _, row := range chessMap {
  17.                 for _, val := range row {
  18.                         fmt.Printf("%d ", val)
  19.                 }
  20.                 fmt.Println()
  21.         }
  22.         // 3. 转为稀疏数组
  23.         var sparseArr []ValNode
  24.         // 首先记录数组的维度(11行11列)和非零值数量
  25.         defaultVal := 0
  26.         nonZeroCount := 0
  27.         for i, row := range chessMap {
  28.                 for j, val := range row {
  29.                         if val != defaultVal {
  30.                                 nonZeroCount++
  31.                                 node := ValNode{
  32.                                         Row: i,
  33.                                         Col: j,
  34.                                         Val: val,
  35.                                 }
  36.                                 sparseArr = append(sparseArr, node)
  37.                         }
  38.                 }
  39.         }
  40.        
  41.         // 头部存储数组信息(行、列、默认值)
  42.         header := ValNode{
  43.                 Row: len(chessMap),
  44.                 Col: len(chessMap[0]),
  45.                 Val: defaultVal,
  46.         }
  47.         sparseArr = append([]ValNode{header}, sparseArr...)
  48.         // 4. 输出稀疏数组
  49.         fmt.Println("\n稀疏数组:")
  50.         for i, node := range sparseArr {
  51.                 if i == 0 {
  52.                         fmt.Printf("头部: %d 行 %d 列 默认值=%d\n", node.Row, node.Col, node.Val)
  53.                 } else {
  54.                         fmt.Printf("%d: %d %d %d\n", i, node.Row, node.Col, node.Val)
  55.                 }
  56.         }
  57.         // 5. 将稀疏数组恢复为原始数组
  58.         var newChessMap [11][11]int
  59.         for i, node := range sparseArr {
  60.                 if i == 0 { // 跳过头部信息
  61.                         continue
  62.                 }
  63.                 newChessMap[node.Row][node.Col] = node.Val
  64.         }
  65.         // 6. 输出恢复后的数组
  66.         fmt.Println("\n恢复后的数组:")
  67.         for _, row := range newChessMap {
  68.                 for _, val := range row {
  69.                         fmt.Printf("%d ", val)
  70.                 }
  71.                 fmt.Println()
  72.         }
  73. }
复制代码
输出示例

运行上述代码会得到类似以下输出:
  1. 原始数组:
  2. 0 0 0 0 0 0 0 0 0 0 0
  3. 0 0 1 0 0 0 0 0 0 0 0
  4. 0 0 0 2 0 0 0 0 0 0 0
  5. 0 0 0 0 0 0 0 0 0 0 0
  6. 0 0 0 0 0 0 0 0 0 0 0
  7. 0 0 0 0 0 0 0 0 0 0 0
  8. 0 0 0 0 0 0 0 0 0 0 0
  9. 0 0 0 0 0 0 0 0 0 0 0
  10. 0 0 0 0 0 0 0 0 0 0 0
  11. 0 0 0 0 0 0 0 0 0 0 0
  12. 0 0 0 0 0 0 0 0 0 0 0
  13. 稀疏数组:
  14. 头部: 11 行 11 列 默认值=0
  15. 1: 1 2 1
  16. 2: 2 3 2
  17. 恢复后的数组:
  18. 0 0 0 0 0 0 0 0 0 0 0
  19. 0 0 1 0 0 0 0 0 0 0 0
  20. 0 0 0 2 0 0 0 0 0 0 0
  21. 0 0 0 0 0 0 0 0 0 0 0
  22. 0 0 0 0 0 0 0 0 0 0 0
  23. 0 0 0 0 0 0 0 0 0 0 0
  24. 0 0 0 0 0 0 0 0 0 0 0
  25. 0 0 0 0 0 0 0 0 0 0 0
  26. 0 0 0 0 0 0 0 0 0 0 0
  27. 0 0 0 0 0 0 0 0 0 0 0
  28. 0 0 0 0 0 0 0 0 0 0 0
复制代码
应用场景

稀疏数组常用于:

  • 棋盘类游戏的数据存储(如五子棋)
  • 图像处理(存储大量空白像素的图像)
  • 大规模矩阵计算(很多元素为0的矩阵)
  • 数据库索引存储
这种数据结构在存储空间昂贵或数据传输受限的场景下特别有用。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册