1.1.1. 一、稀疏数组(Sparse Array)的说明:
如果一个多维数组中,存放了很多相同的元素,不同的元素很少,那就是一个稀疏数组。我们可以稀疏数组压缩转换另一个数组存储,从而节约内存空间。
- 例子:这是一个 11行11列的数组,只有2个数不同,其他的数全部是0,这就是一个稀疏数组。
注意:如果把这些数全部保存起来,会用一个二维数组,并且保存 11x11=121 个数。可以把这个数组转换为另一个数组:
行(row)下标 列(col)下标 值(value) 说明 11 11 0 表示11行11列的默认值是0 1 2 1 第2行,第3列的值是1 2 3 2 第3行,第4列的值是2
转换之后:用一个二维数组就可以保存了,这个二维数组只有3个元素(就是值0、1、2),而原来需要121个元素保存。所以转换之后大大的节约了内存资源。
1.1.2. 二、代码实现如下:
把一个二维的稀疏数组,压缩为另一个数组。
//保存稀疏数组的值
type ValNode struct {
row int
col int
val int
}
func main() {
// 原始数组
var originalArr [11][11]int
originalArr[1][2] = 1
originalArr[2][3] = 2
// 用 []ValNode 作为稀疏数组的元素
var sparseArr []ValNode
//创建一个 ValNode 值结点
valNode := ValNode{
row : 11,
col : 11,
val : 0,
}
sparseArr = append(sparseArr, valNode)
// 给切片增加元素
for i, v := range originalArr {
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)
}
}
第一个元素11、11、0的作用:在把稀疏数组转回原始数组时,其他语言(比如java中)可以声明数组的行列大小(java中
int arr[][] = new int[3][4]
)。go语言中没有作用,因为go语言声明数组时必须确定数组大小。