一、稀疏数组的介绍
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
二、稀疏数组的处理方法:
- 记录数组一共有几行几列,有多少个不同的值;
- 思想: 将具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。
- 举例说明:
- 代码实现:
package main
import "fmt"
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 _, v := range chessMap {
for _, v2 := range v {
fmt.Printf("%d\t", v2)
}
fmt.Println()
}
//3.转成稀疏数组。
// 1)遍历chessMap,如果发现有一个元素的值不为0.创建一个node结构体
// 2)将其放入到对应的切片即可
var sparseArr []ValNode
//标准的稀疏数组应该还有一个:记录元素的二维数组的规模(行,列,默认值)
valNode := ValNode{
row: 11,
col: 11,
val: 0,
}
sparseArr = append(sparseArr, valNode)
for i, v := range chessMap {
for j, v2 := range v {
if v2 != 0 {
//创建一个valNode值结点
valNode := ValNode{
row: i,
col: j,
val: v2,
}
sparseArr = append(sparseArr, valNode)
}
}
}
//输出稀疏数组
fmt.Println("当前的稀疏数组是:")
for i, valNode := range sparseArr {
fmt.Printf("%d: %d %d %d\n", i, valNode.row, valNode.col, valNode.val)
}
//创建一个空的原始数组
var chessMap2 [11][11]int
//遍历spareArr
for i, val := range sparseArr {
if i != 0 { //跳过第一行记录值
chessMap2[val.row][val.col] = val.val
}
}
//看看chessMap2是不是恢复了
fmt.Println("使用稀疏数组恢复的原始数据:")
for _, v := range chessMap2 {
for _, v2 := range v {
fmt.Printf("%d\t", v2)
}
fmt.Println()
}
}
- 结果: