• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
敬YES
Now Or Never
博客园    首页       联系   管理    订阅  订阅
1.Go稀疏数组实现与示例

Go语言中的稀疏数组

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

概念

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

  1. 原始数组的行数和列数
  2. 非默认值的元素数量
  3. 每个非默认值的行索引、列索引和值

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

应用场景

稀疏数组常用于:

  1. 棋盘类游戏的数据存储(如五子棋)
  2. 图像处理(存储大量空白像素的图像)
  3. 大规模矩阵计算(很多元素为0的矩阵)
  4. 数据库索引存储

这种数据结构在存储空间昂贵或数据传输受限的场景下特别有用。

作者:陈敬(公众号:敬YES)
出处:http://www.cnblogs.com/janes/
博客文章仅供交流学习,请勿用于商业用途。如需转载,请务必注明出处。

posted on 2025-10-21 15:35  敬YES  阅读(10)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3