go 数据结构 之 稀疏数组

在这里插入图片描述

什么是稀疏数组

如果一个数组(包括多维数组)中的大部分元素为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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值