Go数据结构之稀疏数组

一:稀疏数组的应用场景

当一个数组中大部分元素为0,或者为同一个值得数组时,可以使用稀疏数组来保存该数组。

①:记录数组一共有几行几列,有多少个不同的值;

②:把不同的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模

③:上图可稀疏数组可变成

row    col   value

11     11      0

1       2       1

2      3        2

由上图可知,稀疏数组可大大减少资源的耗费,其中11     11      0代表有多少行多少列

二:使用举例

①:

package main

import (
	"fmt"
)

type ValNode struct{
	row int
	col int
	val int
}

func main(){
	//原始数组
	var chessMap [11][11]int
	chessMap[1][2] = 1
	chessMap[2][3] = 2

	//打印原始数据
	for i1, v1 := range chessMap {
		for i2, v2 := range v1 {
			fmt.Printf("%d*%d=%d\t", i1, i2, v2)
		}
		fmt.Println()
	}
	//初始化稀疏数组
	var sparseArr []ValNode
	valNode := ValNode{
		row : len(chessMap),
		col : len(chessMap[0]),
		val : 0,
	}

	sparseArr = append(sparseArr ,valNode)

	for i1, v1 := range chessMap {
		for i2, v2 := range v1 {
			if v2 != 0 {
				valNode := ValNode{
					row : i1,
					col : i2,
					val : v2,
				}
				sparseArr = append(sparseArr ,valNode)
			}
		}
	}
	fmt.Println(sparseArr)

}

结果
[ `go run sparseArray.go` | done ]
	0*0=0	0*1=0	0*2=0	0*3=0	0*4=0	0*5=0	0*6=0	0*7=0	0*8=0	0*9=0	0*10=0	
	1*0=0	1*1=0	1*2=1	1*3=0	1*4=0	1*5=0	1*6=0	1*7=0	1*8=0	1*9=0	1*10=0	
	2*0=0	2*1=0	2*2=0	2*3=2	2*4=0	2*5=0	2*6=0	2*7=0	2*8=0	2*9=0	2*10=0	
	3*0=0	3*1=0	3*2=0	3*3=0	3*4=0	3*5=0	3*6=0	3*7=0	3*8=0	3*9=0	3*10=0	
	4*0=0	4*1=0	4*2=0	4*3=0	4*4=0	4*5=0	4*6=0	4*7=0	4*8=0	4*9=0	4*10=0	
	5*0=0	5*1=0	5*2=0	5*3=0	5*4=0	5*5=0	5*6=0	5*7=0	5*8=0	5*9=0	5*10=0	
	6*0=0	6*1=0	6*2=0	6*3=0	6*4=0	6*5=0	6*6=0	6*7=0	6*8=0	6*9=0	6*10=0	
	7*0=0	7*1=0	7*2=0	7*3=0	7*4=0	7*5=0	7*6=0	7*7=0	7*8=0	7*9=0	7*10=0	
	8*0=0	8*1=0	8*2=0	8*3=0	8*4=0	8*5=0	8*6=0	8*7=0	8*8=0	8*9=0	8*10=0	
	9*0=0	9*1=0	9*2=0	9*3=0	9*4=0	9*5=0	9*6=0	9*7=0	9*8=0	9*9=0	9*10=0	
	10*0=0	10*1=0	10*2=0	10*3=0	10*4=0	10*5=0	10*6=0	10*7=0	10*8=0	10*9=0	10*10=0	
	[{11 11 0} {1 2 1} {2 3 2}]

 ②:在上面的基础上稀疏数组变回原来的二维数组

package main

import (
	"fmt"
)

type ValNode struct{
	row int
	col int
	val int
}

func main(){
	//原始数组
	var chessMap [11][11]int
	chessMap[1][2] = 1
	chessMap[2][3] = 2

	//打印原始数据
	// for i1, v1 := range chessMap {
	// 	for i2, v2 := range v1 {
	// 		fmt.Printf("%d*%d=%d\t", i1, i2, v2)
	// 	}
	// 	fmt.Println()
	// }
	//初始化稀疏数组
	var sparseArr []ValNode
	//约定第一行是记录原数组大小
	valNode := ValNode{
		row : len(chessMap),
		col : len(chessMap[0]),
		val : 0,
	}

	sparseArr = append(sparseArr ,valNode)

	for i1, v1 := range chessMap {
		for i2, v2 := range v1 {
			if v2 != 0 {
				valNode := ValNode{
					row : i1,
					col : i2,
					val : v2,
				}
				sparseArr = append(sparseArr ,valNode)
			}
		}
	}
	// fmt.Println(sparseArr[0].col)
	//go不可以使用可变参数赋值var NewChessMap [sparseArr[0].row][sparseArr[0].col]int
	var NewChessMap [11][11]int
	for i, v := range sparseArr {
		if i == 0 {
			continue
		}
		NewChessMap[v.row][v.col] = v.val
	}
	//遍历还原新数组
	for _, v := range NewChessMap{
		fmt.Println(v)
	}
}

结果
[ `go run sparseArray.go` | done ]
	[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]

 

转载于:https://www.cnblogs.com/louis181214/p/10412889.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值